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 928b38164a5bfa66bf64f3bfafd3596b3477272d
Author: [email protected] <[email protected]>
AuthorDate: Mon Mar 30 17:10:23 2026 -0600

    feat(ego-gen): generate global functions and out-param struct methods
    
    Wire global function detection and out-param method support into
    the code generation pipeline. Package-level functions generated
    for receiver-less EFL methods. Methods with known struct out-params
    generate C wrapper shims returning decomposed values.
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
---
 cmd/ego-gen/main.go                 | 117 +++++++++++++++++++++++-------------
 cmd/ego-gen/templates/class.go.tmpl |   5 +-
 cmd/ego-gen/typemap.go              |   2 +-
 efl/canvas/vg_node.go               |  19 ++++++
 efl/canvas/vg_shape.go              |  19 ++++++
 efl/core/proc_env.go                |   5 ++
 efl/eo/object.go                    |  10 +++
 efl/eo/text_markup_util.go          |  14 +++++
 efl/gfx/path.go                     |  19 ++++++
 efl/gfx/shape.go                    |  19 ++++++
 efl/net/dialer_http.go              |  12 ++++
 efl/net/ip_address.go               |  47 +++++++++++++++
 efl/ui/action_connector.go          |  10 +++
 efl/ui/focus_util.go                |   5 ++
 efl/ui/spotlight_util.go            |   5 ++
 efl/ui/textpath.go                  |  19 ++++++
 efl/ui/view_factory.go              |   5 ++
 17 files changed, 287 insertions(+), 45 deletions(-)

diff --git a/cmd/ego-gen/main.go b/cmd/ego-gen/main.go
index e1cdada..767acd4 100644
--- a/cmd/ego-gen/main.go
+++ b/cmd/ego-gen/main.go
@@ -83,6 +83,9 @@ var methodBlocklist = map[string]bool{
 	"efl_access_value_and_text_set": true,
 	// efl.Layout.Calc — not in Elementary.h
 	"efl_layout_calc_force": true,
+	// efl.Layout.Calc — return struct by value; cannot be converted to unsafe.Pointer by cgo
+	"efl_layout_calc_size_min":      true,
+	"efl_layout_calc_parts_extends": true,
 	// efl.Config_Global profile methods — not in Elementary.h (use elm_config_profile_*)
 	"efl_config_profile_derived_add": true,
 	"efl_config_profile_derived_del": true,
@@ -126,9 +129,6 @@ var methodBlocklist = map[string]bool{
 	"efl_file_save": true,
 	// efl.Filter_Model — callback parameter not reported by Eolian; wrong argument count
 	"efl_filter_model_filter_set": true,
-	// efl.Object — global functions (no Eo* first arg); cannot be called with obj receiver
-	"efl_event_global_thaw":  true,
-	"efl_event_global_freeze": true,
 	// efl.Object — struct-by-pointer mismatch in event forwarder methods
 	"efl_event_callback_forwarder_priority_add": true,
 	"efl_event_callback_forwarder_del":          true,
@@ -137,9 +137,6 @@ var methodBlocklist = map[string]bool{
 	// efl.Text_Formatter — wrong argument count reported by Eolian
 	"efl_text_formatter_attribute_insert": true,
 	"efl_text_formatter_attribute_clear":  true,
-	// efl.Text_Markup_Util — utility functions; no Eo* first arg (global-style C functions)
-	"efl_text_markup_util_text_to_markup": true,
-	"efl_text_markup_util_markup_to_text": true,
 	// efl.ThreadIO — callback struct parameters with extra data args not reported by Eolian
 	"efl_threadio_call":      true,
 	"efl_threadio_call_sync": true,
@@ -160,8 +157,6 @@ var methodBlocklist = map[string]bool{
 	"efl_input_clickable_button_state_reset": true,
 	"efl_input_clickable_longpress_abort":    true,
 	// efl.Input.Pointer — position setters now handled via known struct support.
-	// efl.Core.ProcEnv — global function (no Eo* first arg)
-	"efl_env_self": true,
 	// efl.Text_Cursor.Object — returns Eina_Rect by value (struct return not supported in indexed property)
 	"efl_text_cursor_object_lower_cursor_geometry_get": true,
 	"efl_text_cursor_object_cursor_geometry_get":       true,
@@ -252,15 +247,6 @@ var methodBlocklist = map[string]bool{
 	"efl_ui_focus_util_direction_complement": true,
 	// efl.Net.Dialer — method returning Eina_Error (integer, not pointer)
 	"efl_net_dialer_dial": true,
-	// efl.Net.DialerHttp — global utility functions (no Eo* first arg)
-	"efl_net_dialer_http_date_parse":     true,
-	"efl_net_dialer_http_date_serialize": true,
-	// efl.Net.IpAddress — global constructor/utility functions (no Eo* first arg)
-	"efl_net_ip_address_sockaddr_set":         true,
-	"efl_net_ip_address_create":               true,
-	"efl_net_ip_address_create_sockaddr":      true,
-	"efl_net_ip_address_parse":                true,
-	"efl_net_ip_address_resolve":              true,
 	// efl.Net.Server — method returning Eina_Error (integer, not pointer)
 	"efl_net_server_serve": true,
 	// efl.Net.Server.Fd — method returning Eina_Error (integer, not pointer)
@@ -288,17 +274,12 @@ var methodBlocklist = map[string]bool{
 	"efl_ui_item_container_set": true,
 	// efl.Ui.L10n — not in public Elementary.h
 	"efl_ui_l10n_translation_update": true,
-	// efl.Ui.ActionConnector — global functions (no Eo* first arg)
-	"efl_ui_action_connector_bind_clickable_to_theme":  true,
-	"efl_ui_action_connector_bind_clickable_to_object": true,
 	// efl.Ui.Dnd — struct-by-value Eina_Content parameter
 	"efl_ui_dnd_drag_start": true,
 	// efl.Ui.FactoryBind — returns Eina_Error (integer, not pointer)
 	"efl_ui_factory_bind": true,
 	// efl.Ui.FocusManager — returns struct by value
 	"efl_ui_focus_manager_logical_end": true,
-	// efl.Ui.FocusUtil — global function (no Eo* first arg)
-	"efl_ui_focus_util_active_manager": true,
 	// efl.Ui.PositionManagerEntity — returns Eina_Rect struct; out-param index
 	"efl_ui_position_manager_entity_position_single_item": true,
 	"efl_ui_position_manager_entity_relative_item":        true,
@@ -309,17 +290,11 @@ var methodBlocklist = map[string]bool{
 	"efl_ui_property_bind": true,
 	// efl.Ui.Selection — struct-by-value Eina_Content parameter
 	"efl_ui_selection_set": true,
-	// efl.Ui.SpotlightUtil — global function (no Eo* first arg)
-	"efl_ui_spotlight_util_stack_gen": true,
-	// efl.Ui.ViewFactory — global function (no Eo* first arg)
-	"efl_ui_view_factory_create_with_event": true,
 	// efl.Ui.ViewModel — returns Eina_Error; callback-style with extra params
 	"efl_ui_view_model_property_bind":      true,
 	"efl_ui_view_model_factory_bind":       true,
 	"efl_ui_view_model_property_logic_add": true,
 	"efl_ui_view_model_property_logic_del": true,
-	// efl.Ui.Win — global setter (no Eo* first arg)
-	"efl_ui_win_exit_on_all_windows_closed_set": true,
 	// efl.Ui.ViewModel — more methods returning Eina_Error
 	"efl_ui_view_model_property_string_add": true,
 	"efl_ui_view_model_property_string_del": true,
@@ -349,8 +324,6 @@ var methodBlocklist = map[string]bool{
 	"efl_io_reader_read":     true,
 	"efl_io_sizer_resize":    true,
 	"efl_io_writer_write":    true,
-	// efl.Canvas.Animation — global function (no Eo* first arg)
-	"efl_animation_default_duration_set": true,
 	// efl.Canvas.GestureRecognizer — returns enum (not a pointer) through pointer path
 	"efl_gesture_recognizer_recognize": true,
 	// efl.Canvas.Gesture — hotspot setter now handled via known struct support.
@@ -366,8 +339,6 @@ var methodBlocklist = map[string]bool{
 	"efl_canvas_textgrid_palette_get": true,
 	"efl_canvas_textgrid_palette_set": true,
 	// efl.Layout.Group — size_min/size_max now handled via known struct support.
-	// efl.App — global function (no Eo* first arg)
-	"efl_app_main_get": true,
 	// efl.Access.Value — not in Elementary.h
 	"efl_access_value_increment_get": true,
 	// efl.Access.Text — not in Elementary.h
@@ -387,20 +358,45 @@ var methodBlocklist = map[string]bool{
 	// efl.Io.Queue — returns Eina_Slice struct by value
 	"efl_io_queue_slice_get": true,
 	// efl.Text_Cursor.Object — returns Eina_Rect, now handled via known struct support.
-	// efl.Access.Object — global functions or not in Elementary.h
-	"efl_access_object_access_root_get":        true,
+	// efl.Access.Object — not in Elementary.h
 	"efl_access_object_index_in_parent_get":    true,
 	"efl_access_object_localized_role_name_get": true,
 	"efl_access_object_role_name_get":          true,
-	// efl.Object — global function (no Eo* first arg)
-	"efl_event_global_freeze_count_get": true,
-	// efl.Net.SslContext — global function (no Eo* first arg)
+	// efl.Access.Object — efl_access_object_access_root_get is a global function but
+	// Eolian reports it as a property getter; block it here to prevent the Eo-receiver
+	// property wrapper from being emitted (it is also in globalFunctionSet for the method path).
+	"efl_access_object_access_root_get": true,
+	// efl.App — efl_app_main_get is a global function but Eolian reports it as a property
+	// getter; block it here to prevent the Eo-receiver property wrapper from being emitted.
+	"efl_app_main_get": true,
+	// efl.Net.SslContext — efl_net_ssl_context_default_dialer_get is a global function
+	// but Eolian reports it as a property getter; block it to prevent the Eo-receiver wrapper.
 	"efl_net_ssl_context_default_dialer_get": true,
+	// efl.Canvas.Animation — global property getter/setter (no Eo* first arg); Eolian
+	// reports them as a property, so they are not intercepted by the method-loop
+	// globalFunctionSet check.
+	"efl_animation_default_duration_get": true,
+	"efl_animation_default_duration_set": true,
+	// efl.Canvas.GestureTouch — methods that return Eina_Vector2 by value; cgo cannot
+	// convert struct return values to unsafe.Pointer.
+	"efl_gesture_touch_delta":    true,
+	"efl_gesture_touch_distance": true,
+	// efl.Canvas.Scene — image_max_size getter takes a Eina_Size2D out-param in addition
+	// to returning Eina_Bool; the generator only sees the bool return and omits the out-param.
+	"efl_canvas_scene_image_max_size_get": true,
+	// efl.Ui.Theme — efl_ui_theme_default_get is a global function but Eolian reports it
+	// as a property getter; block it here to prevent the Eo-receiver wrapper.
+	"efl_ui_theme_default_get": true,
+	// efl.Ui.Win — exit_on_all_windows_closed is a global property (no Eo* first arg);
+	// Eolian reports getter+setter as property, so block both here.
+	"efl_ui_win_exit_on_all_windows_closed_get": true,
+	"efl_ui_win_exit_on_all_windows_closed_set": true,
+	// efl.Object — efl_event_global_freeze_count_get is a global function but Eolian
+	// reports it as a property getter; block it here to prevent the Eo-receiver wrapper.
+	"efl_event_global_freeze_count_get": true,
 	// efl.Ui.Widget — scrollable_content internal methods not in public Elementary.h
 	"efl_ui_widget_scrollable_content_did_group_calc_get": true,
 	"efl_ui_widget_scrollable_content_did_group_calc_set": true,
-	// efl.Ui.Theme — global function (no Eo* first arg)
-	"efl_ui_theme_default_get": true,
 }
 
 func main() {
@@ -653,12 +649,23 @@ func buildClassData(c *Class, pkgOptionNames map[string]map[string]bool) (ClassD
 	// Extract methods and iterator methods, skipping those in the method blocklist.
 	var methods []MethodData
 	var iteratorMethods []IteratorMethodData
+	var globalFunctions []GlobalFunctionData
 	for _, f := range c.Functions(FunctionMethod) {
 		cFuncName := f.FullCName(FunctionMethod)
 		if methodBlocklist[cFuncName] {
 			log.Printf("ego-gen: skip blocked method %s", cFuncName)
 			continue
 		}
+		// Check if this is a global function (no Eo* receiver).
+		if globalFunctionSet[cFuncName] {
+			gfd := buildGlobalFunctionData(f)
+			if reservedNames[gfd.GoName] {
+				log.Printf("ego-gen: skip global function %s: name %q collides", cFuncName, gfd.GoName)
+				continue
+			}
+			globalFunctions = append(globalFunctions, gfd)
+			continue
+		}
 		// Check if this method returns an iterator.
 		if isIteratorReturnType(f) {
 			imd, err := buildIteratorMethodData(f)
@@ -705,6 +712,9 @@ func buildClassData(c *Class, pkgOptionNames map[string]map[string]bool) (ClassD
 	for _, im := range iteratorMethods {
 		goNames[im.GoName] = true
 	}
+	for _, gf := range globalFunctions {
+		goNames[gf.GoName] = true
+	}
 	for _, e := range events {
 		goNames[e.GoName] = true
 	}
@@ -755,6 +765,16 @@ func buildClassData(c *Class, pkgOptionNames map[string]map[string]bool) (ClassD
 			if methodBlocklist[cFuncName] {
 				continue
 			}
+			// Check if this is a global function (no Eo* receiver).
+			if globalFunctionSet[cFuncName] {
+				gfd := buildGlobalFunctionData(f)
+				if goNames[gfd.GoName] || reservedNames[gfd.GoName] {
+					continue
+				}
+				goNames[gfd.GoName] = true
+				globalFunctions = append(globalFunctions, gfd)
+				continue
+			}
 			// Check for iterator methods from extensions.
 			if isIteratorReturnType(f) {
 				imd, err := buildIteratorMethodData(f)
@@ -971,6 +991,7 @@ func buildClassData(c *Class, pkgOptionNames map[string]map[string]bool) (ClassD
 		IteratorMethods:     iteratorMethods,
 		HasIterators:        len(iteratorMethods) > 0,
 		IteratorStructTypes: deduplicateIteratorStructTypes(iteratorMethods),
+		GlobalFunctions:     globalFunctions,
 	}, nil
 }
 
@@ -1126,19 +1147,29 @@ func buildPropertyData(f *Function, cPrefix string) (PropertyData, error) {
 		cType = rt.CType()
 		goType = CTypeToGo(cType)
 		isEo = rt.IsClass()
-		if IsKnownStruct(cType) {
+		if si := GetStructInfo(cType); si != nil && !si.IsSlice {
 			isStruct = true
+		} else if si != nil && si.IsSlice {
+			// Eina_Slice / Eina_Rw_Slice: the property getter returns a slice
+			// struct whose fields include "const void *", which cannot be used
+			// as a cgo variable type. Disable the getter for such properties.
+			hasGet = false
 		}
 	} else if getVals := f.PropertyValues(FunctionPropGet); len(getVals) == 1 {
 		// Single getter value parameter — the C getter returns this type
 		// directly even though Eolian reports it as an out-param.
 		if pt := getVals[0].Type(); pt != nil {
 			ct := pt.CType()
-			if IsKnownStruct(ct) {
-				// Known struct: keep getter enabled, mark as struct.
+			if si := GetStructInfo(ct); si != nil && !si.IsSlice {
+				// Known non-slice struct: keep getter enabled, mark as struct.
 				isStruct = true
 				cType = ct
 				goType = CTypeToGo(ct)
+			} else if si != nil && si.IsSlice {
+				// Eina_Slice / Eina_Rw_Slice: disable getter (see above).
+				hasGet = false
+				cType = ct
+				goType = CTypeToGo(ct)
 			} else if IsStructType(ct) {
 				// Unknown struct: cannot be cast through uintptr_t.
 				// Disable the getter.
@@ -1160,7 +1191,7 @@ func buildPropertyData(f *Function, cPrefix string) (PropertyData, error) {
 				cType = pt.CType()
 				goType = CTypeToGo(cType)
 				isEo = pt.IsClass()
-				if IsKnownStruct(cType) {
+				if si := GetStructInfo(cType); si != nil && !si.IsSlice {
 					isStruct = true
 				}
 			}
diff --git a/cmd/ego-gen/templates/class.go.tmpl b/cmd/ego-gen/templates/class.go.tmpl
index 539d704..da260ce 100644
--- a/cmd/ego-gen/templates/class.go.tmpl
+++ b/cmd/ego-gen/templates/class.go.tmpl
@@ -165,7 +165,10 @@ static void _ego_get_struct_ip_{{$ip.CGetName}}(const Eo *obj{{range $ip.Keys}},
 // _ego_outparam_{{$m.CName}} wraps the method, decomposing the out-param struct
 // into individual pointer arguments for safe cgo consumption.
 static void _ego_outparam_{{$m.CName}}(Eo *obj{{range $i, $p := $m.Params}}, {{if needsStringConversion $p.CType}}const char *{{else if isBoolType $p.CType}}Eina_Bool{{else if $p.IsEo}}Eo *{{else if isPointerType $p.GoType}}void *{{else}}{{$p.CType}}{{end}} {{$p.GoName}}{{end}}{{range $i, $f := $op.StructInfo.CFields}}, {{index $op.StructInfo.CFieldTypes $i}} *out_{{$f}}{{end}}) {
-    {{$op.CType}} _r = {{$m.CName}}(obj{{range $m.Params}}, {{.GoName}}{{end}});
+{{- if $m.ReturnCType}}    {{$op.CType}} _r = {{$m.CName}}(obj{{range $m.Params}}, {{.GoName}}{{end}});
+{{- else}}    {{$op.CType}} _r = {0};
+    {{$m.CName}}(obj{{range $m.Params}}, {{.GoName}}{{end}}, &_r);
+{{- end}}
 {{- range $i, $f := $op.StructInfo.CFields}}
     *out_{{$f}} = _r{{$op.StructInfo.CAccessPrefix}}.{{$f}};
 {{- end}}
diff --git a/cmd/ego-gen/typemap.go b/cmd/ego-gen/typemap.go
index acaacf6..97d9754 100644
--- a/cmd/ego-gen/typemap.go
+++ b/cmd/ego-gen/typemap.go
@@ -202,7 +202,7 @@ func IsCPointerType(ctype string) bool {
 // maps directly to unsafe.Pointer without requiring a (*C.TYPE) cast.
 func IsVoidPointer(ctype string) bool {
 	t := strings.TrimSpace(ctype)
-	return t == "void *" || t == "void*"
+	return t == "void *" || t == "void*" || t == "const void *" || t == "const void*"
 }
 
 // IsEoType reports whether a C type is an Eo-derived object pointer. All EFL
diff --git a/efl/canvas/vg_node.go b/efl/canvas/vg_node.go
index d25202c..1c48b34 100644
--- a/efl/canvas/vg_node.go
+++ b/efl/canvas/vg_node.go
@@ -115,6 +115,15 @@ static void _ego_get_struct_efl_gfx_entity_geometry_get(const Eo *obj, int *out_
 static void _ego_set_struct_efl_gfx_entity_geometry_set(Eo *obj, int x, int y, int w, int h) {
     efl_gfx_entity_geometry_set(obj, EINA_RECT(x, y, w, h));
 }
+// _ego_outparam_efl_gfx_path_bounds_get wraps the method, decomposing the out-param struct
+// into individual pointer arguments for safe cgo consumption.
+static void _ego_outparam_efl_gfx_path_bounds_get(Eo *obj, int *out_x, int *out_y, int *out_w, int *out_h) {    Eina_Rect _r = {0};
+    efl_gfx_path_bounds_get(obj, &_r);
+    *out_x = _r.rect.x;
+    *out_y = _r.rect.y;
+    *out_w = _r.rect.w;
+    *out_h = _r.rect.h;
+}
 // _ego_ev_EFL_GFX_ENTITY_EVENT_VISIBILITY_CHANGED returns the event description pointer using the EFL
 // macro, avoiding a conflicting extern declaration for the symbol name.
 static const Efl_Event_Description *_ego_ev_EFL_GFX_ENTITY_EVENT_VISIBILITY_CHANGED(void) {
@@ -356,6 +365,16 @@ func (o *VgNode) CopyFrom(dupFrom efl.Objecter) {
 	C.efl_gfx_path_copy_from((*C.Eo)(o.Eo()), (*C.Eo)(dupFrom.Eo()))
 }
 
+// BoundsGet calls the efl_gfx_path_bounds_get method on VgNode.
+func (o *VgNode) BoundsGet() efl.Rect {
+	var cx C.int
+	var cy C.int
+	var cw C.int
+	var ch C.int
+	C._ego_outparam_efl_gfx_path_bounds_get((*C.Eo)(o.Eo()), &cx, &cy, &cw, &ch)
+	return efl.Rect{X: int(cx), Y: int(cy), W: int(cw), H: int(ch)}
+}
+
 // Reset calls the efl_gfx_path_reset method on VgNode.
 func (o *VgNode) Reset() {
 	C.efl_gfx_path_reset((*C.Eo)(o.Eo()))
diff --git a/efl/canvas/vg_shape.go b/efl/canvas/vg_shape.go
index 409f05b..ec0a292 100644
--- a/efl/canvas/vg_shape.go
+++ b/efl/canvas/vg_shape.go
@@ -121,6 +121,15 @@ static void _ego_set_efl_gfx_shape_fill_rule_set(Eo *obj, void *val) {
         (__typeof__(efl_gfx_shape_fill_rule_get((const Eo *)0)))(uintptr_t)val;
     efl_gfx_shape_fill_rule_set(obj, typed);
 }
+// _ego_outparam_efl_gfx_path_bounds_get wraps the method, decomposing the out-param struct
+// into individual pointer arguments for safe cgo consumption.
+static void _ego_outparam_efl_gfx_path_bounds_get(Eo *obj, int *out_x, int *out_y, int *out_w, int *out_h) {    Eina_Rect _r = {0};
+    efl_gfx_path_bounds_get(obj, &_r);
+    *out_x = _r.rect.x;
+    *out_y = _r.rect.y;
+    *out_w = _r.rect.w;
+    *out_h = _r.rect.h;
+}
 */
 import "C"
 
@@ -330,6 +339,16 @@ func (o *VgShape) CopyFrom(dupFrom efl.Objecter) {
 	C.efl_gfx_path_copy_from((*C.Eo)(o.Eo()), (*C.Eo)(dupFrom.Eo()))
 }
 
+// BoundsGet calls the efl_gfx_path_bounds_get method on VgShape.
+func (o *VgShape) BoundsGet() efl.Rect {
+	var cx C.int
+	var cy C.int
+	var cw C.int
+	var ch C.int
+	C._ego_outparam_efl_gfx_path_bounds_get((*C.Eo)(o.Eo()), &cx, &cy, &cw, &ch)
+	return efl.Rect{X: int(cx), Y: int(cy), W: int(cw), H: int(ch)}
+}
+
 // Reset calls the efl_gfx_path_reset method on VgShape.
 func (o *VgShape) Reset() {
 	C.efl_gfx_path_reset((*C.Eo)(o.Eo()))
diff --git a/efl/core/proc_env.go b/efl/core/proc_env.go
index dc691d2..f69f8bd 100644
--- a/efl/core/proc_env.go
+++ b/efl/core/proc_env.go
@@ -88,3 +88,8 @@ func NewProcEnv(parent efl.Objecter, opts ...efl.Option) *ProcEnv {
 	}
 	return wrapProcEnv(result)
 }
+
+// Self is a package-level EFL function with no object receiver.
+func Self() unsafe.Pointer {
+	return unsafe.Pointer(C.efl_env_self())
+}
diff --git a/efl/eo/object.go b/efl/eo/object.go
index 35748f2..c906065 100644
--- a/efl/eo/object.go
+++ b/efl/eo/object.go
@@ -333,3 +333,13 @@ func (o *Object) ChildrenIteratorNew() iter.Seq[unsafe.Pointer] {
 		}
 	}
 }
+
+// EventGlobalThaw is a package-level EFL function with no object receiver.
+func EventGlobalThaw() {
+	C.efl_event_global_thaw()
+}
+
+// EventGlobalFreeze is a package-level EFL function with no object receiver.
+func EventGlobalFreeze() {
+	C.efl_event_global_freeze()
+}
diff --git a/efl/eo/text_markup_util.go b/efl/eo/text_markup_util.go
index ff197d2..858fdee 100644
--- a/efl/eo/text_markup_util.go
+++ b/efl/eo/text_markup_util.go
@@ -88,3 +88,17 @@ func NewTextMarkupUtil(parent efl.Objecter, opts ...efl.Option) *TextMarkupUtil
 	}
 	return wrapTextMarkupUtil(result)
 }
+
+// TextToMarkup is a package-level EFL function with no object receiver.
+func TextToMarkup(text string) string {
+	ctext := C.CString(text)
+	defer C.free(unsafe.Pointer(ctext))
+	return C.GoString(C.efl_text_markup_util_text_to_markup(ctext))
+}
+
+// MarkupToText is a package-level EFL function with no object receiver.
+func MarkupToText(text string) string {
+	ctext := C.CString(text)
+	defer C.free(unsafe.Pointer(ctext))
+	return C.GoString(C.efl_text_markup_util_markup_to_text(ctext))
+}
diff --git a/efl/gfx/path.go b/efl/gfx/path.go
index 74d1072..94df73b 100644
--- a/efl/gfx/path.go
+++ b/efl/gfx/path.go
@@ -37,6 +37,15 @@ typedef Eo Efl_Ui_Widget;
 // Declare the class_get function directly rather than including the full .eo.h
 // header, which may reference types from other .eo files that are not included.
 extern const Efl_Class *efl_gfx_path_mixin_get(void);
+// _ego_outparam_efl_gfx_path_bounds_get wraps the method, decomposing the out-param struct
+// into individual pointer arguments for safe cgo consumption.
+static void _ego_outparam_efl_gfx_path_bounds_get(Eo *obj, int *out_x, int *out_y, int *out_w, int *out_h) {    Eina_Rect _r = {0};
+    efl_gfx_path_bounds_get(obj, &_r);
+    *out_x = _r.rect.x;
+    *out_y = _r.rect.y;
+    *out_w = _r.rect.w;
+    *out_h = _r.rect.h;
+}
 */
 import "C"
 
@@ -91,6 +100,16 @@ func (o *Path) CopyFrom(dupFrom efl.Objecter) {
 	C.efl_gfx_path_copy_from((*C.Eo)(o.Eo()), (*C.Eo)(dupFrom.Eo()))
 }
 
+// BoundsGet calls the efl_gfx_path_bounds_get method on Path.
+func (o *Path) BoundsGet() efl.Rect {
+	var cx C.int
+	var cy C.int
+	var cw C.int
+	var ch C.int
+	C._ego_outparam_efl_gfx_path_bounds_get((*C.Eo)(o.Eo()), &cx, &cy, &cw, &ch)
+	return efl.Rect{X: int(cx), Y: int(cy), W: int(cw), H: int(ch)}
+}
+
 // Reset calls the efl_gfx_path_reset method on Path.
 func (o *Path) Reset() {
 	C.efl_gfx_path_reset((*C.Eo)(o.Eo()))
diff --git a/efl/gfx/shape.go b/efl/gfx/shape.go
index 7dbf69f..27a5755 100644
--- a/efl/gfx/shape.go
+++ b/efl/gfx/shape.go
@@ -79,6 +79,15 @@ static void _ego_set_efl_gfx_shape_fill_rule_set(Eo *obj, void *val) {
         (__typeof__(efl_gfx_shape_fill_rule_get((const Eo *)0)))(uintptr_t)val;
     efl_gfx_shape_fill_rule_set(obj, typed);
 }
+// _ego_outparam_efl_gfx_path_bounds_get wraps the method, decomposing the out-param struct
+// into individual pointer arguments for safe cgo consumption.
+static void _ego_outparam_efl_gfx_path_bounds_get(Eo *obj, int *out_x, int *out_y, int *out_w, int *out_h) {    Eina_Rect _r = {0};
+    efl_gfx_path_bounds_get(obj, &_r);
+    *out_x = _r.rect.x;
+    *out_y = _r.rect.y;
+    *out_w = _r.rect.w;
+    *out_h = _r.rect.h;
+}
 */
 import "C"
 
@@ -231,6 +240,16 @@ func (o *Shape) CopyFrom(dupFrom efl.Objecter) {
 	C.efl_gfx_path_copy_from((*C.Eo)(o.Eo()), (*C.Eo)(dupFrom.Eo()))
 }
 
+// BoundsGet calls the efl_gfx_path_bounds_get method on Shape.
+func (o *Shape) BoundsGet() efl.Rect {
+	var cx C.int
+	var cy C.int
+	var cw C.int
+	var ch C.int
+	C._ego_outparam_efl_gfx_path_bounds_get((*C.Eo)(o.Eo()), &cx, &cy, &cw, &ch)
+	return efl.Rect{X: int(cx), Y: int(cy), W: int(cw), H: int(ch)}
+}
+
 // Reset calls the efl_gfx_path_reset method on Shape.
 func (o *Shape) Reset() {
 	C.efl_gfx_path_reset((*C.Eo)(o.Eo()))
diff --git a/efl/net/dialer_http.go b/efl/net/dialer_http.go
index 0dd6547..8da2aa8 100644
--- a/efl/net/dialer_http.go
+++ b/efl/net/dialer_http.go
@@ -527,3 +527,15 @@ func (o *DialerHttp) OnClosed(fn func()) efl.Handle {
 			fn()
 		})
 }
+
+// DateParse is a package-level EFL function with no object receiver.
+func DateParse(str string) int64 {
+	cstr := C.CString(str)
+	defer C.free(unsafe.Pointer(cstr))
+	return int64(C.efl_net_dialer_http_date_parse(cstr))
+}
+
+// DateSerialize is a package-level EFL function with no object receiver.
+func DateSerialize(epochtime int64) string {
+	return C.GoString(C.efl_net_dialer_http_date_serialize(C.int64_t(epochtime)))
+}
diff --git a/efl/net/ip_address.go b/efl/net/ip_address.go
index 1765d2d..3433e38 100644
--- a/efl/net/ip_address.go
+++ b/efl/net/ip_address.go
@@ -50,6 +50,19 @@ static void _ego_set_efl_net_ip_address_port_set(Eo *obj, void *val) {
         (__typeof__(efl_net_ip_address_port_get((const Eo *)0)))(uintptr_t)val;
     efl_net_ip_address_port_set(obj, typed);
 }
+// _ego_get_efl_net_ip_address_sockaddr_get wraps the getter, casting the return value through
+// uintptr_t so that both pointer and integer returns become void *.
+// This prevents C type conflicts when Eolian's type differs from the header.
+static void *_ego_get_efl_net_ip_address_sockaddr_get(const Eo *obj) {
+    return (void *)(uintptr_t)efl_net_ip_address_sockaddr_get(obj);
+}
+// _ego_set_efl_net_ip_address_sockaddr_set wraps the setter, using __typeof__ on the getter to
+// infer the actual parameter type so void * can be cast correctly.
+static void _ego_set_efl_net_ip_address_sockaddr_set(Eo *obj, void *val) {
+    __typeof__(efl_net_ip_address_sockaddr_get((const Eo *)0)) typed =
+        (__typeof__(efl_net_ip_address_sockaddr_get((const Eo *)0)))(uintptr_t)val;
+    efl_net_ip_address_sockaddr_set(obj, typed);
+}
 */
 import "C"
 
@@ -129,6 +142,16 @@ func (o *IpAddress) SetPort(val unsafe.Pointer) {
 	C._ego_set_efl_net_ip_address_port_set((*C.Eo)(o.Eo()), val)
 }
 
+// Sockaddr returns the Sockaddr property of the IpAddress.
+func (o *IpAddress) Sockaddr() unsafe.Pointer {
+	return unsafe.Pointer(C._ego_get_efl_net_ip_address_sockaddr_get((*C.Eo)(o.Eo())))
+}
+
+// SetSockaddr sets the Sockaddr property of the IpAddress.
+func (o *IpAddress) SetSockaddr(val unsafe.Pointer) {
+	C._ego_set_efl_net_ip_address_sockaddr_set((*C.Eo)(o.Eo()), val)
+}
+
 // Ipv4ClassACheck calls the efl_net_ip_address_ipv4_class_a_check method on IpAddress.
 func (o *IpAddress) Ipv4ClassACheck() bool {
 	return C.efl_net_ip_address_ipv4_class_a_check((*C.Eo)(o.Eo())) != 0
@@ -183,3 +206,27 @@ func (o *IpAddress) LoopbackCheck() bool {
 func (o *IpAddress) AnyCheck() bool {
 	return C.efl_net_ip_address_any_check((*C.Eo)(o.Eo())) != 0
 }
+
+// Create is a package-level EFL function with no object receiver.
+func Create(port unsafe.Pointer, address unsafe.Pointer) unsafe.Pointer {
+	return unsafe.Pointer(C.efl_net_ip_address_create(*(*C.uint16_t)(port), *(*C.Eina_Slice)(address)))
+}
+
+// CreateSockaddr is a package-level EFL function with no object receiver.
+func CreateSockaddr(sockaddr unsafe.Pointer) unsafe.Pointer {
+	return unsafe.Pointer(C.efl_net_ip_address_create_sockaddr(sockaddr))
+}
+
+// Parse is a package-level EFL function with no object receiver.
+func Parse(numericAddress string) unsafe.Pointer {
+	cnumericAddress := C.CString(numericAddress)
+	defer C.free(unsafe.Pointer(cnumericAddress))
+	return unsafe.Pointer(C.efl_net_ip_address_parse(cnumericAddress))
+}
+
+// Resolve is a package-level EFL function with no object receiver.
+func Resolve(address string, family int, flags int) unsafe.Pointer {
+	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)))
+}
diff --git a/efl/ui/action_connector.go b/efl/ui/action_connector.go
index b6a8b59..9d0abfd 100644
--- a/efl/ui/action_connector.go
+++ b/efl/ui/action_connector.go
@@ -88,3 +88,13 @@ func NewActionConnector(parent efl.Objecter, opts ...efl.Option) *ActionConnecto
 	}
 	return wrapActionConnector(result)
 }
+
+// BindClickableToTheme is a package-level EFL function with no object receiver.
+func BindClickableToTheme(object efl.Objecter, clickable efl.Objecter) {
+	C.efl_ui_action_connector_bind_clickable_to_theme((*C.Eo)(object.Eo()), (*C.Eo)(clickable.Eo()))
+}
+
+// BindClickableToObject is a package-level EFL function with no object receiver.
+func BindClickableToObject(object efl.Objecter, clickable efl.Objecter) {
+	C.efl_ui_action_connector_bind_clickable_to_object((*C.Eo)(object.Eo()), (*C.Eo)(clickable.Eo()))
+}
diff --git a/efl/ui/focus_util.go b/efl/ui/focus_util.go
index 416ce30..71349cc 100644
--- a/efl/ui/focus_util.go
+++ b/efl/ui/focus_util.go
@@ -89,3 +89,8 @@ func NewFocusUtil(parent efl.Objecter, opts ...efl.Option) *FocusUtil {
 	}
 	return wrapFocusUtil(result)
 }
+
+// ActiveManager is a package-level EFL function with no object receiver.
+func ActiveManager(manager efl.Objecter) unsafe.Pointer {
+	return unsafe.Pointer(C.efl_ui_focus_util_active_manager((*C.Eo)(manager.Eo())))
+}
diff --git a/efl/ui/spotlight_util.go b/efl/ui/spotlight_util.go
index b83d4c3..27b973b 100644
--- a/efl/ui/spotlight_util.go
+++ b/efl/ui/spotlight_util.go
@@ -88,3 +88,8 @@ func NewSpotlightUtil(parent efl.Objecter, opts ...efl.Option) *SpotlightUtil {
 	}
 	return wrapSpotlightUtil(result)
 }
+
+// StackGen is a package-level EFL function with no object receiver.
+func StackGen(parent efl.Objecter) unsafe.Pointer {
+	return unsafe.Pointer(C.efl_ui_spotlight_util_stack_gen((*C.Eo)(parent.Eo())))
+}
diff --git a/efl/ui/textpath.go b/efl/ui/textpath.go
index 4bd7d8c..9536e62 100644
--- a/efl/ui/textpath.go
+++ b/efl/ui/textpath.go
@@ -43,6 +43,15 @@ typedef Eo Efl_Ui_Widget;
 // Declare the class_get function directly rather than including the full .eo.h
 // header, which may reference types from other .eo files that are not included.
 extern const Efl_Class *efl_ui_textpath_class_get(void);
+// _ego_outparam_efl_gfx_path_bounds_get wraps the method, decomposing the out-param struct
+// into individual pointer arguments for safe cgo consumption.
+static void _ego_outparam_efl_gfx_path_bounds_get(Eo *obj, int *out_x, int *out_y, int *out_w, int *out_h) {    Eina_Rect _r = {0};
+    efl_gfx_path_bounds_get(obj, &_r);
+    *out_x = _r.rect.x;
+    *out_y = _r.rect.y;
+    *out_w = _r.rect.w;
+    *out_h = _r.rect.h;
+}
 */
 import "C"
 
@@ -166,6 +175,16 @@ func (o *Textpath) CopyFrom(dupFrom efl.Objecter) {
 	C.efl_gfx_path_copy_from((*C.Eo)(o.Eo()), (*C.Eo)(dupFrom.Eo()))
 }
 
+// BoundsGet calls the efl_gfx_path_bounds_get method on Textpath.
+func (o *Textpath) BoundsGet() efl.Rect {
+	var cx C.int
+	var cy C.int
+	var cw C.int
+	var ch C.int
+	C._ego_outparam_efl_gfx_path_bounds_get((*C.Eo)(o.Eo()), &cx, &cy, &cw, &ch)
+	return efl.Rect{X: int(cx), Y: int(cy), W: int(cw), H: int(ch)}
+}
+
 // Reset calls the efl_gfx_path_reset method on Textpath.
 func (o *Textpath) Reset() {
 	C.efl_gfx_path_reset((*C.Eo)(o.Eo()))
diff --git a/efl/ui/view_factory.go b/efl/ui/view_factory.go
index a6f4b99..754ddd7 100644
--- a/efl/ui/view_factory.go
+++ b/efl/ui/view_factory.go
@@ -88,3 +88,8 @@ func NewViewFactory(parent efl.Objecter, opts ...efl.Option) *ViewFactory {
 	}
 	return wrapViewFactory(result)
 }
+
+// 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)))
+}

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

Reply via email to