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.