This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch main
in repository ego.

View the commit online.

commit 297373702e40b73c36017cae4653f1329b3cf94b
Author: [email protected] <[email protected]>
AuthorDate: Wed Apr 1 14:07:15 2026 -0600

    feat(ego-gen): map Eina_Future to channel, Eina_Content to wrapper
    
    Methods returning Eina_Future now return <-chan *efl.Value.
    Methods taking Eina_Content now accept *efl.Content.
    Unblocks Factory.create, Dnd.drag_start, Selection.selection_set.
    Coverage 97.2% (1255/1291).
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
---
 cmd/ego-gen/generator.go            |   2 ++
 cmd/ego-gen/generator_test.go       |  36 ++++++++++++++++++++++++++++++++++++
 cmd/ego-gen/main.go                 |   9 +++------
 cmd/ego-gen/templates/class.go.tmpl |   5 +++++
 cmd/ego-gen/typemap.go              |  23 +++++++++++++++++++++++
 cmd/ego-stats/main.go               |   8 +++-----
 cmd/ego-stats/typemap.go            |  22 +++++++++++++++++++++-
 efl/canvas/textblock.go             |   4 ++--
 efl/eo/loop.go                      |  12 ++++++------
 efl/eo/loop_consumer.go             |   8 ++++----
 efl/eo/loop_model.go                |  12 ++++++------
 efl/eo/model.go                     |  12 ++++++------
 efl/net/control_access_point.go     |   4 ++--
 efl/net/control_technology.go       |   4 ++--
 efl/net/ip_address.go               |   4 ++--
 efl/ui/dnd.go                       |  11 +++++++++--
 efl/ui/factory.go                   |   5 +++++
 efl/ui/selection.go                 |   9 +++++++--
 efl/ui/spotlight_container.go       |   4 ++--
 efl/ui/view_factory.go              |   4 ++--
 efl/ui/widget.go                    |  20 ++++++++++++++++----
 efl/ui/widget_factory.go            |   5 +++++
 ego-stats                           | Bin 2791504 -> 2791624 bytes
 23 files changed, 169 insertions(+), 54 deletions(-)

diff --git a/cmd/ego-gen/generator.go b/cmd/ego-gen/generator.go
index 52efba5..a2807f8 100644
--- a/cmd/ego-gen/generator.go
+++ b/cmd/ego-gen/generator.go
@@ -295,6 +295,8 @@ func NewGenerator(templateDir, outputDir string) (*Generator, error) {
 		"isEnumTypedefKey":  IsEnumTypedefKey,
 		"isEinaValue":       IsEinaValue,
 		"isEinaError":       IsEinaError,
+		"isEinaFuture":      IsEinaFuture,
+		"isEinaContent":     IsEinaContent,
 	}
 
 	pattern := filepath.Join(templateDir, "*.tmpl")
diff --git a/cmd/ego-gen/generator_test.go b/cmd/ego-gen/generator_test.go
index fffa9af..d755dbe 100644
--- a/cmd/ego-gen/generator_test.go
+++ b/cmd/ego-gen/generator_test.go
@@ -1454,3 +1454,39 @@ func TestGenerateClass_StructReturnMethod(t *testing.T) {
 		}
 	}
 }
+
+func TestGenerateClass_EinaContentParam(t *testing.T) {
+	g, outDir := newTestGenerator(t)
+	data := ClassData{
+		PackageName: "ui", GoName: "Selection",
+		EolianName: "Efl.Ui.Selection", CClassName: "EFL_UI_SELECTION_CLASS",
+		CClassGetFunc: "efl_ui_selection_class_get", CPrefix: "efl_ui_selection",
+		EOHeaderFile: "efl_ui_selection.eo.h", IsAbstract: true,
+		Methods: []MethodData{{
+			GoName: "SelectionSet", CName: "efl_ui_selection_set",
+			Params: []ParamData{
+				{GoName: "buffer", GoType: "unsafe.Pointer", CType: "Efl_Ui_Cnp_Buffer"},
+				{GoName: "content", GoType: "*efl.Content", CType: "Eina_Content *"},
+				{GoName: "seat", GoType: "uint", CType: "unsigned int"},
+			},
+		}},
+	}
+	if err := g.GenerateClass(data); err != nil {
+		t.Fatalf("GenerateClass: %v", err)
+	}
+	outFile := filepath.Join(outDir, "ui", "selection.go")
+	content, err := os.ReadFile(outFile)
+	if err != nil {
+		t.Fatalf("not found: %v", err)
+	}
+	src := string(content)
+	mustContain := []string{
+		"func (o *Selection) SelectionSet(buffer unsafe.Pointer, content *efl.Content, seat uint)",
+		".Ptr()",
+	}
+	for _, want := range mustContain {
+		if !strings.Contains(src, want) {
+			t.Errorf("missing %q\n%s", want, src)
+		}
+	}
+}
diff --git a/cmd/ego-gen/main.go b/cmd/ego-gen/main.go
index 3c73792..6357864 100644
--- a/cmd/ego-gen/main.go
+++ b/cmd/ego-gen/main.go
@@ -86,8 +86,7 @@ var methodBlocklist = map[string]bool{
 	// efl.Net.Socket.Udp — init takes Efl_Net_Ip_Address* (not in Eolian definition); also needs
 	// EFL_NET_SOCKET_UDP_PROTECTED which is not defined in the template.
 	"efl_net_socket_udp_init": true,
-	// efl.Ui.Factory — factory_create returns Eina_Future* (not a simple pointer)
-	"efl_ui_factory_create": true,
+	// efl.Ui.Factory — factory_create: Eina_Future* now handled via isEinaFuture.
 	// efl.Ui.FocusUtil — static methods with non-Eo first arg; generator wraps incorrectly
 	"efl_ui_focus_util_focus":                true,
 	"efl_ui_focus_util_direction_complement": true,
@@ -97,8 +96,7 @@ var methodBlocklist = map[string]bool{
 	// (3 extra params not reflected in Eolian's property model). Keep blocked to prevent
 	// the property wrapper from generating a broken C shim with too few arguments.
 	"efl_ui_format_func_set": true,
-	// efl.Ui.Dnd — struct-by-value Eina_Content parameter
-	"efl_ui_dnd_drag_start": true,
+	// efl.Ui.Dnd — drag_start: Eina_Content* now handled via isEinaContent.
 	// efl.Ui.FocusManager — returns struct by value
 	"efl_ui_focus_manager_logical_end": true,
 	// efl.Ui.PositionManagerEntity — returns Eina_Rect struct; out-param index
@@ -107,8 +105,7 @@ var methodBlocklist = map[string]bool{
 	// efl.Ui.PositionManagerDataAccessV1 — data_access setter takes callback+data+free_cb triplets;
 	// Eolian reports fewer params than the actual C declaration.
 	"efl_ui_position_manager_data_access_v1_data_access_set": true,
-	// efl.Ui.Selection — struct-by-value Eina_Content parameter
-	"efl_ui_selection_set": true,
+	// efl.Ui.Selection — selection_set: Eina_Content* now handled via isEinaContent.
 	// efl.Ui.ViewModel — property_logic_add has complex multi-callback + iterator params
 	// that the generator cannot handle (Eolian reports fewer params than the C declaration).
 	"efl_ui_view_model_property_logic_add": true,
diff --git a/cmd/ego-gen/templates/class.go.tmpl b/cmd/ego-gen/templates/class.go.tmpl
index 6d4043c..5c88a34 100644
--- a/cmd/ego-gen/templates/class.go.tmpl
+++ b/cmd/ego-gen/templates/class.go.tmpl
@@ -828,6 +828,8 @@ func (o *{{$.GoName}}) {{.GoName}}({{range $i, $p := .Params}}{{if $i}}, {{end}}
     return C.{{.CName}}((*C.Eo)(o.Eo()){{range .Params}}, {{template "paramArg" .}}{{end}}) != 0
 {{- else if isEinaValue .ReturnCType}}
     return efl.WrapValue(unsafe.Pointer(C.{{.CName}}((*C.Eo)(o.Eo()){{range .Params}}, {{template "paramArg" .}}{{end}})))
+{{- else if isEinaFuture .ReturnCType}}
+    return efl.FutureToChannel(unsafe.Pointer(C.{{.CName}}((*C.Eo)(o.Eo()){{range .Params}}, {{template "paramArg" .}}{{end}})))
 {{- else if isPointerType .ReturnType}}
     return unsafe.Pointer(C.{{.CName}}((*C.Eo)(o.Eo()){{range .Params}}, {{template "paramArg" .}}{{end}}))
 {{- else}}
@@ -1122,6 +1124,8 @@ func {{$gf.GoName}}({{range $i, $p := $gf.Params}}{{if $i}}, {{end}}{{$p.GoName}
     return C.GoString(C.{{$gf.CName}}({{range $i, $p := $gf.Params}}{{if $i}}, {{end}}{{template "paramArg" $p}}{{end}}))
 {{- else if isBoolType $gf.ReturnCType}}
     return C.{{$gf.CName}}({{range $i, $p := $gf.Params}}{{if $i}}, {{end}}{{template "paramArg" $p}}{{end}}) != 0
+{{- else if isEinaFuture $gf.ReturnCType}}
+    return efl.FutureToChannel(unsafe.Pointer(C.{{$gf.CName}}({{range $i, $p := $gf.Params}}{{if $i}}, {{end}}{{template "paramArg" $p}}{{end}})))
 {{- else if $gf.IsEoReturn}}
     return unsafe.Pointer(C.{{$gf.CName}}({{range $i, $p := $gf.Params}}{{if $i}}, {{end}}{{template "paramArg" $p}}{{end}}))
 {{- else}}
@@ -1140,6 +1144,7 @@ func {{$gf.GoName}}({{range $i, $p := $gf.Params}}{{if $i}}, {{end}}{{$p.GoName}
 {{- if isCPointerType .CType}}(*C.Eina_Value)({{.GoName}}.Ptr())
 {{- else}}*(*C.Eina_Value)({{.GoName}}.Ptr())
 {{- end}}
+{{- else if isEinaContent .CType}}(*C.Eina_Content)({{.GoName}}.Ptr())
 {{- else if isPointerType .GoType}}
 {{- if isVoidPointer .CType}}{{.GoName}}
 {{- else if isCPointerType .CType}}(*C.{{stripPointerSuffix .CType}})({{.GoName}})
diff --git a/cmd/ego-gen/typemap.go b/cmd/ego-gen/typemap.go
index fe1619e..e041255 100644
--- a/cmd/ego-gen/typemap.go
+++ b/cmd/ego-gen/typemap.go
@@ -141,6 +141,13 @@ func CTypeToGo(ctype string) string {
 		return "error"
 	}
 
+	if IsEinaFuture(ctype) {
+		return "<-chan *efl.Value"
+	}
+	if IsEinaContent(ctype) {
+		return "*efl.Content"
+	}
+
 	// Any remaining pointer type (ends with "*") becomes an opaque pointer.
 	if strings.HasSuffix(ctype, "*") {
 		return "unsafe.Pointer"
@@ -308,6 +315,22 @@ func IsEnumTypedefKey(ctype string) bool {
 	return goType == "unsafe.Pointer"
 }
 
+// IsEinaFuture reports whether a C type is Eina_Future* — an asynchronous
+// future that ego-gen maps to a Go receive channel (<-chan *efl.Value).
+func IsEinaFuture(ctype string) bool {
+	ct := strings.TrimSpace(ctype)
+	return ct == "Eina_Future *" || ct == "Eina_Future*"
+}
+
+// IsEinaContent reports whether a C type is Eina_Content or Eina_Content* —
+// a typed data blob that ego-gen maps to *efl.Content.
+func IsEinaContent(ctype string) bool {
+	ct := strings.TrimSpace(ctype)
+	ct = strings.TrimPrefix(ct, "const ")
+	ct = strings.TrimSpace(ct)
+	return ct == "Eina_Content" || ct == "Eina_Content *"
+}
+
 // CTypeToCgo maps a C type to a valid cgo type identifier that can be used in
 // expressions like C.<type>(value). Multi-word C types like "unsigned int" are
 // mapped to their single-word cgo equivalents ("C.uint"). Leading "const "
diff --git a/cmd/ego-stats/main.go b/cmd/ego-stats/main.go
index 49a9654..c50fbab 100644
--- a/cmd/ego-stats/main.go
+++ b/cmd/ego-stats/main.go
@@ -94,8 +94,7 @@ var methodBlocklistAnnotated = []blockedEntry{
 	// efl.Canvas.Animation — global property getter/setter (no Eo* first arg)
 	{"efl_animation_default_duration_get", ReasonGlobalFunction},
 	{"efl_animation_default_duration_set", ReasonGlobalFunction},
-	// efl.Ui.Factory — factory_create returns Eina_Future* (not a simple pointer)
-	{"efl_ui_factory_create", ReasonEinaError},
+	// efl.Ui.Factory — factory_create: Eina_Future* now bound via isEinaFuture.
 	// efl.Ui.FocusManager — returns struct by value
 	{"efl_ui_focus_manager_logical_end", ReasonOutParamStruct},
 	// efl.Ui.FocusUtil — static methods with non-Eo first arg; generator wraps incorrectly
@@ -103,14 +102,13 @@ var methodBlocklistAnnotated = []blockedEntry{
 	{"efl_ui_focus_util_direction_complement", ReasonWrongArgCount},
 	// efl.Ui.Format — func_set takes callback+data+free_cb (3 extra params, not 1)
 	{"efl_ui_format_func_set", ReasonCallback},
-	// efl.Ui.Dnd — struct-by-value Eina_Content parameter
-	{"efl_ui_dnd_drag_start", ReasonStructByValue},
+	// efl.Ui.Dnd — drag_start: Eina_Content* now bound via isEinaContent.
 	// efl.Ui.PositionManagerEntity — struct/out-param issues
 	{"efl_ui_position_manager_entity_position_single_item", ReasonOutParamStruct},
 	{"efl_ui_position_manager_entity_relative_item", ReasonOutParamStruct},
 	// efl.Ui.PositionManagerDataAccessV1 — callback triplet params
 	{"efl_ui_position_manager_data_access_v1_data_access_set", ReasonCallback},
-	{"efl_ui_selection_set", ReasonStructByValue},
+	// efl.Ui.Selection — selection_set: Eina_Content* now bound via isEinaContent.
 	// efl.Ui.Theme — global
 	{"efl_ui_theme_default_get", ReasonGlobalFunction},
 	// efl.Ui.ViewModel — callback params
diff --git a/cmd/ego-stats/typemap.go b/cmd/ego-stats/typemap.go
index 44fdebe..e49d15d 100644
--- a/cmd/ego-stats/typemap.go
+++ b/cmd/ego-stats/typemap.go
@@ -46,12 +46,32 @@ func CTypeToGo(ctype string) string {
 	case "void *", "Eo *", "const Eo *":
 		return "unsafe.Pointer"
 	}
+	if IsEinaFuture(ctype) {
+		return "<-chan *efl.Value"
+	}
+	if IsEinaContent(ctype) {
+		return "*efl.Content"
+	}
 	if strings.HasSuffix(ctype, "*") {
 		return "unsafe.Pointer"
 	}
 	return "unsafe.Pointer"
 }
 
+// IsEinaFuture reports whether a C type is Eina_Future*.
+func IsEinaFuture(ctype string) bool {
+	ct := strings.TrimSpace(ctype)
+	return ct == "Eina_Future *" || ct == "Eina_Future*"
+}
+
+// IsEinaContent reports whether a C type is Eina_Content or Eina_Content*.
+func IsEinaContent(ctype string) bool {
+	ct := strings.TrimSpace(ctype)
+	ct = strings.TrimPrefix(ct, "const ")
+	ct = strings.TrimSpace(ct)
+	return ct == "Eina_Content" || ct == "Eina_Content *"
+}
+
 // NeedsStringConversion reports whether a C type requires string conversion.
 func NeedsStringConversion(ctype string) bool {
 	return strings.Contains(ctype, "char *") ||
@@ -69,7 +89,7 @@ func IsKnownStruct(ctype string) bool {
 	ct = strings.TrimSpace(ct)
 	switch ct {
 	case "Eina_Size2D", "Eina_Position2D", "Eina_Rect", "Eina_Vector2",
-		"Eina_Slice", "Eina_Rw_Slice", "Eina_Value", "Efl_Time":
+		"Eina_Slice", "Eina_Rw_Slice", "Eina_Value", "Efl_Time", "Eina_Content":
 		return true
 	}
 	return false
diff --git a/efl/canvas/textblock.go b/efl/canvas/textblock.go
index 7cc0b3a..02072e9 100644
--- a/efl/canvas/textblock.go
+++ b/efl/canvas/textblock.go
@@ -1047,8 +1047,8 @@ func (o *Textblock) ObstaclesUpdate() {
 }
 
 // AsyncLayout calls the efl_canvas_textblock_async_layout method on Textblock.
-func (o *Textblock) AsyncLayout() unsafe.Pointer {
-	return unsafe.Pointer(C.efl_canvas_textblock_async_layout((*C.Eo)(o.Eo())))
+func (o *Textblock) AsyncLayout() <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_canvas_textblock_async_layout((*C.Eo)(o.Eo()))))
 }
 
 // FilterInputAlpha calls the evas_filter_input_alpha method on Textblock.
diff --git a/efl/eo/loop.go b/efl/eo/loop.go
index 486583a..9a5d500 100644
--- a/efl/eo/loop.go
+++ b/efl/eo/loop.go
@@ -197,18 +197,18 @@ func (o *Loop) Quit(exitCode *efl.Value) {
 }
 
 // Job calls the efl_loop_job method on Loop.
-func (o *Loop) Job() unsafe.Pointer {
-	return unsafe.Pointer(C.efl_loop_job((*C.Eo)(o.Eo())))
+func (o *Loop) Job() <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_loop_job((*C.Eo)(o.Eo()))))
 }
 
 // Idle calls the efl_loop_idle method on Loop.
-func (o *Loop) Idle() unsafe.Pointer {
-	return unsafe.Pointer(C.efl_loop_idle((*C.Eo)(o.Eo())))
+func (o *Loop) Idle() <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_loop_idle((*C.Eo)(o.Eo()))))
 }
 
 // Timeout calls the efl_loop_timeout method on Loop.
-func (o *Loop) Timeout(time float64) unsafe.Pointer {
-	return unsafe.Pointer(C.efl_loop_timeout((*C.Eo)(o.Eo()), C.double(time)))
+func (o *Loop) Timeout(time float64) <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_loop_timeout((*C.Eo)(o.Eo()), C.double(time))))
 }
 
 // OnIdleEnter registers fn as a callback for the EFL_LOOP_EVENT_IDLE_ENTER event on Loop.
diff --git a/efl/eo/loop_consumer.go b/efl/eo/loop_consumer.go
index 9d3cc67..312cd80 100644
--- a/efl/eo/loop_consumer.go
+++ b/efl/eo/loop_consumer.go
@@ -128,13 +128,13 @@ func (o *LoopConsumer) Loop() unsafe.Pointer {
 }
 
 // FutureResolved calls the efl_loop_future_resolved method on LoopConsumer.
-func (o *LoopConsumer) FutureResolved(result *efl.Value) unsafe.Pointer {
-	return unsafe.Pointer(C.efl_loop_future_resolved((*C.Eo)(o.Eo()), *(*C.Eina_Value)(result.Ptr())))
+func (o *LoopConsumer) FutureResolved(result *efl.Value) <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_loop_future_resolved((*C.Eo)(o.Eo()), *(*C.Eina_Value)(result.Ptr()))))
 }
 
 // FutureRejected calls the efl_loop_future_rejected method on LoopConsumer.
-func (o *LoopConsumer) FutureRejected(error int) unsafe.Pointer {
-	return unsafe.Pointer(C.efl_loop_future_rejected((*C.Eo)(o.Eo()), C.Eina_Error(error)))
+func (o *LoopConsumer) FutureRejected(error int) <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_loop_future_rejected((*C.Eo)(o.Eo()), C.Eina_Error(error))))
 }
 
 // PromiseNew calls the efl_loop_promise_new method on LoopConsumer.
diff --git a/efl/eo/loop_model.go b/efl/eo/loop_model.go
index 67a4162..f7b6a6d 100644
--- a/efl/eo/loop_model.go
+++ b/efl/eo/loop_model.go
@@ -161,20 +161,20 @@ func (o *LoopModel) VolatileMake() {
 }
 
 // PropertyReadyGet calls the efl_model_property_ready_get method on LoopModel.
-func (o *LoopModel) PropertyReadyGet(property string) unsafe.Pointer {
+func (o *LoopModel) PropertyReadyGet(property string) <-chan *efl.Value {
 	cproperty := C.CString(property)
 	defer C.free(unsafe.Pointer(cproperty))
-	return unsafe.Pointer(C.efl_model_property_ready_get((*C.Eo)(o.Eo()), cproperty))
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_model_property_ready_get((*C.Eo)(o.Eo()), cproperty)))
 }
 
 // ChildrenSliceGet calls the efl_model_children_slice_get method on LoopModel.
-func (o *LoopModel) ChildrenSliceGet(start uint, count uint) unsafe.Pointer {
-	return unsafe.Pointer(C.efl_model_children_slice_get((*C.Eo)(o.Eo()), C.uint(start), C.uint(count)))
+func (o *LoopModel) ChildrenSliceGet(start uint, count uint) <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_model_children_slice_get((*C.Eo)(o.Eo()), C.uint(start), C.uint(count))))
 }
 
 // ChildrenIndexGet calls the efl_model_children_index_get method on LoopModel.
-func (o *LoopModel) ChildrenIndexGet(indices unsafe.Pointer) unsafe.Pointer {
-	return unsafe.Pointer(C.efl_model_children_index_get((*C.Eo)(o.Eo()), (*C.Eina_Iterator)(indices)))
+func (o *LoopModel) ChildrenIndexGet(indices unsafe.Pointer) <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_model_children_index_get((*C.Eo)(o.Eo()), (*C.Eina_Iterator)(indices))))
 }
 
 // ChildAdd calls the efl_model_child_add method on LoopModel.
diff --git a/efl/eo/model.go b/efl/eo/model.go
index ef7c853..ae08851 100644
--- a/efl/eo/model.go
+++ b/efl/eo/model.go
@@ -153,20 +153,20 @@ func (o *Model) ChildrenCount() uint {
 }
 
 // PropertyReadyGet calls the efl_model_property_ready_get method on Model.
-func (o *Model) PropertyReadyGet(property string) unsafe.Pointer {
+func (o *Model) PropertyReadyGet(property string) <-chan *efl.Value {
 	cproperty := C.CString(property)
 	defer C.free(unsafe.Pointer(cproperty))
-	return unsafe.Pointer(C.efl_model_property_ready_get((*C.Eo)(o.Eo()), cproperty))
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_model_property_ready_get((*C.Eo)(o.Eo()), cproperty)))
 }
 
 // ChildrenSliceGet calls the efl_model_children_slice_get method on Model.
-func (o *Model) ChildrenSliceGet(start uint, count uint) unsafe.Pointer {
-	return unsafe.Pointer(C.efl_model_children_slice_get((*C.Eo)(o.Eo()), C.uint(start), C.uint(count)))
+func (o *Model) ChildrenSliceGet(start uint, count uint) <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_model_children_slice_get((*C.Eo)(o.Eo()), C.uint(start), C.uint(count))))
 }
 
 // ChildrenIndexGet calls the efl_model_children_index_get method on Model.
-func (o *Model) ChildrenIndexGet(indices unsafe.Pointer) unsafe.Pointer {
-	return unsafe.Pointer(C.efl_model_children_index_get((*C.Eo)(o.Eo()), (*C.Eina_Iterator)(indices)))
+func (o *Model) ChildrenIndexGet(indices unsafe.Pointer) <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_model_children_index_get((*C.Eo)(o.Eo()), (*C.Eina_Iterator)(indices))))
 }
 
 // ChildAdd calls the efl_model_child_add method on Model.
diff --git a/efl/net/control_access_point.go b/efl/net/control_access_point.go
index 9f52503..d30008c 100644
--- a/efl/net/control_access_point.go
+++ b/efl/net/control_access_point.go
@@ -416,8 +416,8 @@ func (o *ControlAccessPoint) SetConfigurationIpv6(method unsafe.Pointer, address
 }
 
 // Connect calls the efl_net_control_access_point_connect method on ControlAccessPoint.
-func (o *ControlAccessPoint) Connect() unsafe.Pointer {
-	return unsafe.Pointer(C.efl_net_control_access_point_connect((*C.Eo)(o.Eo())))
+func (o *ControlAccessPoint) Connect() <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_net_control_access_point_connect((*C.Eo)(o.Eo()))))
 }
 
 // Disconnect calls the efl_net_control_access_point_disconnect method on ControlAccessPoint.
diff --git a/efl/net/control_technology.go b/efl/net/control_technology.go
index 1b6351e..892191e 100644
--- a/efl/net/control_technology.go
+++ b/efl/net/control_technology.go
@@ -203,8 +203,8 @@ func (o *ControlTechnology) Type() unsafe.Pointer {
 }
 
 // Scan calls the efl_net_control_technology_scan method on ControlTechnology.
-func (o *ControlTechnology) Scan() unsafe.Pointer {
-	return unsafe.Pointer(C.efl_net_control_technology_scan((*C.Eo)(o.Eo())))
+func (o *ControlTechnology) Scan() <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_net_control_technology_scan((*C.Eo)(o.Eo()))))
 }
 
 // OnChanged registers fn as a callback for the EFL_NET_CONTROL_TECHNOLOGY_EVENT_CHANGED event on ControlTechnology.
diff --git a/efl/net/ip_address.go b/efl/net/ip_address.go
index 1b2d0c9..9627e45 100644
--- a/efl/net/ip_address.go
+++ b/efl/net/ip_address.go
@@ -295,8 +295,8 @@ func Parse(numericAddress string) unsafe.Pointer {
 }
 
 // Resolve is a package-level EFL function with no object receiver.
-func Resolve(address string, family int, flags int) unsafe.Pointer {
+func Resolve(address string, family int, flags int) <-chan *efl.Value {
 	caddress := C.CString(address)
 	defer C.free(unsafe.Pointer(caddress))
-	return unsafe.Pointer(C.efl_net_ip_address_resolve(caddress, C.int(family), C.int(flags)))
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_net_ip_address_resolve(caddress, C.int(family), C.int(flags))))
 }
diff --git a/efl/ui/dnd.go b/efl/ui/dnd.go
index 0d58b08..64f0014 100644
--- a/efl/ui/dnd.go
+++ b/efl/ui/dnd.go
@@ -151,14 +151,21 @@ func wrapDnd(ptr unsafe.Pointer) *Dnd {
 	return o
 }
 
+// DragStart calls the efl_ui_dnd_drag_start method on Dnd.
+func (o *Dnd) DragStart(content *efl.Content, action string, seat uint) unsafe.Pointer {
+	caction := C.CString(action)
+	defer C.free(unsafe.Pointer(caction))
+	return unsafe.Pointer(C.efl_ui_dnd_drag_start((*C.Eo)(o.Eo()), (*C.Eina_Content)(content.Ptr()), caction, C.uint(seat)))
+}
+
 // DragCancel calls the efl_ui_dnd_drag_cancel method on Dnd.
 func (o *Dnd) DragCancel(seat uint) {
 	C.efl_ui_dnd_drag_cancel((*C.Eo)(o.Eo()), C.uint(seat))
 }
 
 // DropDataGet calls the efl_ui_dnd_drop_data_get method on Dnd.
-func (o *Dnd) DropDataGet(seat uint, acceptableTypes unsafe.Pointer) unsafe.Pointer {
-	return unsafe.Pointer(C.efl_ui_dnd_drop_data_get((*C.Eo)(o.Eo()), C.uint(seat), (*C.Eina_Iterator)(acceptableTypes)))
+func (o *Dnd) DropDataGet(seat uint, acceptableTypes unsafe.Pointer) <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_ui_dnd_drop_data_get((*C.Eo)(o.Eo()), C.uint(seat), (*C.Eina_Iterator)(acceptableTypes))))
 }
 
 type dndDragOffsetProperty struct {
diff --git a/efl/ui/factory.go b/efl/ui/factory.go
index 7fdca0e..2073b5f 100644
--- a/efl/ui/factory.go
+++ b/efl/ui/factory.go
@@ -152,6 +152,11 @@ func wrapFactory(ptr unsafe.Pointer) *Factory {
 	return o
 }
 
+// Create calls the efl_ui_factory_create method on Factory.
+func (o *Factory) Create(models unsafe.Pointer) <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_ui_factory_create((*C.Eo)(o.Eo()), (*C.Eina_Iterator)(models))))
+}
+
 // Release calls the efl_ui_factory_release method on Factory.
 func (o *Factory) Release(uiViews unsafe.Pointer) {
 	C.efl_ui_factory_release((*C.Eo)(o.Eo()), (*C.Eina_Iterator)(uiViews))
diff --git a/efl/ui/selection.go b/efl/ui/selection.go
index f593c70..2c0fa8f 100644
--- a/efl/ui/selection.go
+++ b/efl/ui/selection.go
@@ -121,14 +121,19 @@ func wrapSelection(ptr unsafe.Pointer) *Selection {
 	return o
 }
 
+// SelectionSet calls the efl_ui_selection_set method on Selection.
+func (o *Selection) SelectionSet(buffer unsafe.Pointer, content *efl.Content, seat uint) {
+	C.efl_ui_selection_set((*C.Eo)(o.Eo()), *(*C.Efl_Ui_Cnp_Buffer)(buffer), (*C.Eina_Content)(content.Ptr()), C.uint(seat))
+}
+
 // SelectionClear calls the efl_ui_selection_clear method on Selection.
 func (o *Selection) SelectionClear(buffer unsafe.Pointer, seat uint) {
 	C.efl_ui_selection_clear((*C.Eo)(o.Eo()), *(*C.Efl_Ui_Cnp_Buffer)(buffer), C.uint(seat))
 }
 
 // SelectionGet calls the efl_ui_selection_get method on Selection.
-func (o *Selection) SelectionGet(buffer unsafe.Pointer, seat uint, acceptableTypes unsafe.Pointer) unsafe.Pointer {
-	return unsafe.Pointer(C.efl_ui_selection_get((*C.Eo)(o.Eo()), *(*C.Efl_Ui_Cnp_Buffer)(buffer), C.uint(seat), (*C.Eina_Iterator)(acceptableTypes)))
+func (o *Selection) SelectionGet(buffer unsafe.Pointer, seat uint, acceptableTypes unsafe.Pointer) <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_ui_selection_get((*C.Eo)(o.Eo()), *(*C.Efl_Ui_Cnp_Buffer)(buffer), C.uint(seat), (*C.Eina_Iterator)(acceptableTypes))))
 }
 
 // HasSelection calls the efl_ui_selection_has_selection method on Selection.
diff --git a/efl/ui/spotlight_container.go b/efl/ui/spotlight_container.go
index d26857b..353d647 100644
--- a/efl/ui/spotlight_container.go
+++ b/efl/ui/spotlight_container.go
@@ -308,12 +308,12 @@ func (o *SpotlightContainer) Push(widget efl.Objecter) {
 }
 
 // Pop calls the efl_ui_spotlight_pop method on SpotlightContainer.
-func (o *SpotlightContainer) Pop(deletionOnTransitionEnd bool) unsafe.Pointer {
+func (o *SpotlightContainer) Pop(deletionOnTransitionEnd bool) <-chan *efl.Value {
 	var cdeletionOnTransitionEnd C.Eina_Bool
 	if deletionOnTransitionEnd {
 		cdeletionOnTransitionEnd = 1
 	}
-	return unsafe.Pointer(C.efl_ui_spotlight_pop((*C.Eo)(o.Eo()), cdeletionOnTransitionEnd))
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_ui_spotlight_pop((*C.Eo)(o.Eo()), cdeletionOnTransitionEnd)))
 }
 
 // PackBegin calls the efl_pack_begin method on SpotlightContainer.
diff --git a/efl/ui/view_factory.go b/efl/ui/view_factory.go
index d529721..383ed87 100644
--- a/efl/ui/view_factory.go
+++ b/efl/ui/view_factory.go
@@ -144,6 +144,6 @@ func NewViewFactory(parent efl.Objecter, opts ...efl.Option) *ViewFactory {
 }
 
 // CreateWithEvent is a package-level EFL function with no object receiver.
-func CreateWithEvent(factory efl.Objecter, models unsafe.Pointer) unsafe.Pointer {
-	return unsafe.Pointer(C.efl_ui_view_factory_create_with_event((*C.Eo)(factory.Eo()), (*C.Eina_Iterator)(models)))
+func CreateWithEvent(factory efl.Objecter, models unsafe.Pointer) <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_ui_view_factory_create_with_event((*C.Eo)(factory.Eo()), (*C.Eina_Iterator)(models))))
 }
diff --git a/efl/ui/widget.go b/efl/ui/widget.go
index edfa5a1..9085cd3 100644
--- a/efl/ui/widget.go
+++ b/efl/ui/widget.go
@@ -1119,14 +1119,19 @@ func (o *Widget) TranslationUpdate() {
 	C.efl_ui_l10n_translation_update((*C.Eo)(o.Eo()))
 }
 
+// SelectionSet calls the efl_ui_selection_set method on Widget.
+func (o *Widget) SelectionSet(buffer unsafe.Pointer, content *efl.Content, seat uint) {
+	C.efl_ui_selection_set((*C.Eo)(o.Eo()), *(*C.Efl_Ui_Cnp_Buffer)(buffer), (*C.Eina_Content)(content.Ptr()), C.uint(seat))
+}
+
 // SelectionClear calls the efl_ui_selection_clear method on Widget.
 func (o *Widget) SelectionClear(buffer unsafe.Pointer, seat uint) {
 	C.efl_ui_selection_clear((*C.Eo)(o.Eo()), *(*C.Efl_Ui_Cnp_Buffer)(buffer), C.uint(seat))
 }
 
 // SelectionGet calls the efl_ui_selection_get method on Widget.
-func (o *Widget) SelectionGet(buffer unsafe.Pointer, seat uint, acceptableTypes unsafe.Pointer) unsafe.Pointer {
-	return unsafe.Pointer(C.efl_ui_selection_get((*C.Eo)(o.Eo()), *(*C.Efl_Ui_Cnp_Buffer)(buffer), C.uint(seat), (*C.Eina_Iterator)(acceptableTypes)))
+func (o *Widget) SelectionGet(buffer unsafe.Pointer, seat uint, acceptableTypes unsafe.Pointer) <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_ui_selection_get((*C.Eo)(o.Eo()), *(*C.Efl_Ui_Cnp_Buffer)(buffer), C.uint(seat), (*C.Eina_Iterator)(acceptableTypes))))
 }
 
 // HasSelection calls the efl_ui_selection_has_selection method on Widget.
@@ -1134,14 +1139,21 @@ func (o *Widget) HasSelection(buffer unsafe.Pointer, seat uint) bool {
 	return C.efl_ui_selection_has_selection((*C.Eo)(o.Eo()), *(*C.Efl_Ui_Cnp_Buffer)(buffer), C.uint(seat)) != 0
 }
 
+// DragStart calls the efl_ui_dnd_drag_start method on Widget.
+func (o *Widget) DragStart(content *efl.Content, action string, seat uint) unsafe.Pointer {
+	caction := C.CString(action)
+	defer C.free(unsafe.Pointer(caction))
+	return unsafe.Pointer(C.efl_ui_dnd_drag_start((*C.Eo)(o.Eo()), (*C.Eina_Content)(content.Ptr()), caction, C.uint(seat)))
+}
+
 // DragCancel calls the efl_ui_dnd_drag_cancel method on Widget.
 func (o *Widget) DragCancel(seat uint) {
 	C.efl_ui_dnd_drag_cancel((*C.Eo)(o.Eo()), C.uint(seat))
 }
 
 // DropDataGet calls the efl_ui_dnd_drop_data_get method on Widget.
-func (o *Widget) DropDataGet(seat uint, acceptableTypes unsafe.Pointer) unsafe.Pointer {
-	return unsafe.Pointer(C.efl_ui_dnd_drop_data_get((*C.Eo)(o.Eo()), C.uint(seat), (*C.Eina_Iterator)(acceptableTypes)))
+func (o *Widget) DropDataGet(seat uint, acceptableTypes unsafe.Pointer) <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_ui_dnd_drop_data_get((*C.Eo)(o.Eo()), C.uint(seat), (*C.Eina_Iterator)(acceptableTypes))))
 }
 
 // PropertyBind calls the efl_ui_property_bind method on Widget.
diff --git a/efl/ui/widget_factory.go b/efl/ui/widget_factory.go
index c7cc2c5..8ab813c 100644
--- a/efl/ui/widget_factory.go
+++ b/efl/ui/widget_factory.go
@@ -221,6 +221,11 @@ func (o *WidgetFactory) SetItemClass(val efl.Objecter) {
 	C.efl_ui_widget_factory_item_class_set((*C.Eo)(o.Eo()), (*C.Eo)(val.Eo()))
 }
 
+// Create calls the efl_ui_factory_create method on WidgetFactory.
+func (o *WidgetFactory) Create(models unsafe.Pointer) <-chan *efl.Value {
+	return efl.FutureToChannel(unsafe.Pointer(C.efl_ui_factory_create((*C.Eo)(o.Eo()), (*C.Eina_Iterator)(models))))
+}
+
 // Release calls the efl_ui_factory_release method on WidgetFactory.
 func (o *WidgetFactory) Release(uiViews unsafe.Pointer) {
 	C.efl_ui_factory_release((*C.Eo)(o.Eo()), (*C.Eina_Iterator)(uiViews))
diff --git a/ego-stats b/ego-stats
index 2f3f56b..96d501d 100755
Binary files a/ego-stats and b/ego-stats differ

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to