From: Olaf Wintermann Date: Sun, 13 Jul 2025 17:23:13 +0000 (+0200) Subject: add text widgets X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=98e8eaeaaa1c78cbbfbb2e8753f4906a70dabad3;p=rssreader.git add text widgets --- diff --git a/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java b/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java index e9a6d80..d4d6647 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ArgFuncs.java @@ -203,6 +203,44 @@ class ArgFuncs { MethodHandle sourcelist_args_set_onbuttonclickdata; MethodHandle sourcelist_args_free; + MethodHandle textarea_args_new; + MethodHandle textarea_args_set_fill; + MethodHandle textarea_args_set_hexpand; + MethodHandle textarea_args_set_vexpand; + MethodHandle textarea_args_set_hfill; + MethodHandle textarea_args_set_vfill; + MethodHandle textarea_args_set_override_defaults; + MethodHandle textarea_args_set_colspan; + MethodHandle textarea_args_set_rowspan; + MethodHandle textarea_args_set_name; + MethodHandle textarea_args_set_style_class; + MethodHandle textarea_args_set_varname; + MethodHandle textarea_args_set_value; + MethodHandle textarea_args_set_onchange; + MethodHandle textarea_args_set_onchangedata; + MethodHandle textarea_args_set_groups; + MethodHandle textarea_args_free; + + MethodHandle textfield_args_new; + MethodHandle textfield_args_set_fill; + MethodHandle textfield_args_set_hexpand; + MethodHandle textfield_args_set_vexpand; + MethodHandle textfield_args_set_hfill; + MethodHandle textfield_args_set_vfill; + MethodHandle textfield_args_set_override_defaults; + MethodHandle textfield_args_set_colspan; + MethodHandle textfield_args_set_rowspan; + MethodHandle textfield_args_set_name; + MethodHandle textfield_args_set_style_class; + MethodHandle textfield_args_set_varname; + MethodHandle textfield_args_set_value; + MethodHandle textfield_args_set_onchange; + MethodHandle textfield_args_set_onchangedata; + MethodHandle textfield_args_set_onactivate; + MethodHandle textfield_args_set_onactivatedata; + MethodHandle textfield_args_set_groups; + MethodHandle textfield_args_free; + private ArgFuncs(Linker linker, SymbolLookup lib) { FunctionDescriptor sigm = FunctionDescriptor.of(ValueLayout.ADDRESS); FunctionDescriptor sigv_m = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS); @@ -408,6 +446,44 @@ class ArgFuncs { MemorySegment ui_sourcelist_args_set_onbuttonclickdata_addr = lib.find("ui_sourcelist_args_set_onbuttonclickdata").orElseThrow(); MemorySegment ui_sourcelist_args_free_addr = lib.find("ui_sourcelist_args_free").orElseThrow(); + MemorySegment ui_textarea_args_new_addr = lib.find("ui_textarea_args_new").orElseThrow(); + MemorySegment ui_textarea_args_set_fill_addr = lib.find("ui_textarea_args_set_fill").orElseThrow(); + MemorySegment ui_textarea_args_set_hexpand_addr = lib.find("ui_textarea_args_set_hexpand").orElseThrow(); + MemorySegment ui_textarea_args_set_vexpand_addr = lib.find("ui_textarea_args_set_vexpand").orElseThrow(); + MemorySegment ui_textarea_args_set_hfill_addr = lib.find("ui_textarea_args_set_hfill").orElseThrow(); + MemorySegment ui_textarea_args_set_vfill_addr = lib.find("ui_textarea_args_set_vfill").orElseThrow(); + MemorySegment ui_textarea_args_set_override_defaults_addr = lib.find("ui_textarea_args_set_override_defaults").orElseThrow(); + MemorySegment ui_textarea_args_set_colspan_addr = lib.find("ui_textarea_args_set_colspan").orElseThrow(); + MemorySegment ui_textarea_args_set_rowspan_addr = lib.find("ui_textarea_args_set_rowspan").orElseThrow(); + MemorySegment ui_textarea_args_set_name_addr = lib.find("ui_textarea_args_set_name").orElseThrow(); + MemorySegment ui_textarea_args_set_style_class_addr = lib.find("ui_textarea_args_set_style_class").orElseThrow(); + MemorySegment ui_textarea_args_set_varname_addr = lib.find("ui_textarea_args_set_varname").orElseThrow(); + MemorySegment ui_textarea_args_set_value_addr = lib.find("ui_textarea_args_set_value").orElseThrow(); + MemorySegment ui_textarea_args_set_onchange_addr = lib.find("ui_textarea_args_set_onchange").orElseThrow(); + MemorySegment ui_textarea_args_set_onchangedata_addr = lib.find("ui_textarea_args_set_onchangedata").orElseThrow(); + MemorySegment ui_textarea_args_set_groups_addr = lib.find("ui_textarea_args_set_groups").orElseThrow(); + MemorySegment ui_textarea_args_free_addr = lib.find("ui_textarea_args_free").orElseThrow(); + + MemorySegment ui_textfield_args_new_addr = lib.find("ui_textfield_args_new").orElseThrow(); + MemorySegment ui_textfield_args_set_fill_addr = lib.find("ui_textfield_args_set_fill").orElseThrow(); + MemorySegment ui_textfield_args_set_hexpand_addr = lib.find("ui_textfield_args_set_hexpand").orElseThrow(); + MemorySegment ui_textfield_args_set_vexpand_addr = lib.find("ui_textfield_args_set_vexpand").orElseThrow(); + MemorySegment ui_textfield_args_set_hfill_addr = lib.find("ui_textfield_args_set_hfill").orElseThrow(); + MemorySegment ui_textfield_args_set_vfill_addr = lib.find("ui_textfield_args_set_vfill").orElseThrow(); + MemorySegment ui_textfield_args_set_override_defaults_addr = lib.find("ui_textfield_args_set_override_defaults").orElseThrow(); + MemorySegment ui_textfield_args_set_colspan_addr = lib.find("ui_textfield_args_set_colspan").orElseThrow(); + MemorySegment ui_textfield_args_set_rowspan_addr = lib.find("ui_textfield_args_set_rowspan").orElseThrow(); + MemorySegment ui_textfield_args_set_name_addr = lib.find("ui_textfield_args_set_name").orElseThrow(); + MemorySegment ui_textfield_args_set_style_class_addr = lib.find("ui_textfield_args_set_style_class").orElseThrow(); + MemorySegment ui_textfield_args_set_varname_addr = lib.find("ui_textfield_args_set_varname").orElseThrow(); + MemorySegment ui_textfield_args_set_value_addr = lib.find("ui_textfield_args_set_value").orElseThrow(); + MemorySegment ui_textfield_args_set_onchange_addr = lib.find("ui_textfield_args_set_onchange").orElseThrow(); + MemorySegment ui_textfield_args_set_onchangedata_addr = lib.find("ui_textfield_args_set_onchangedata").orElseThrow(); + MemorySegment ui_textfield_args_set_onactivate_addr = lib.find("ui_textfield_args_set_onactivate").orElseThrow(); + MemorySegment ui_textfield_args_set_onactivatedata_addr = lib.find("ui_textfield_args_set_onactivatedata").orElseThrow(); + MemorySegment ui_textfield_args_set_groups_addr = lib.find("ui_textfield_args_set_groups").orElseThrow(); + MemorySegment ui_textfield_args_free_addr = lib.find("ui_textfield_^args_free").orElseThrow(); + menuitem_args_new = linker.downcallHandle(ui_menuitem_args_new_addr, sigm); menuitem_args_set_label = linker.downcallHandle(ui_menuitem_args_set_label_addr, sigv_mm); menuitem_args_set_stockid = linker.downcallHandle(ui_menuitem_args_set_stockid_addr, sigv_mm); @@ -604,6 +680,44 @@ class ArgFuncs { sourcelist_args_set_onbuttonclick = linker.downcallHandle(ui_sourcelist_args_set_onbuttonclick_addr, sigv_mm); sourcelist_args_set_onbuttonclickdata = linker.downcallHandle(ui_sourcelist_args_set_onbuttonclickdata_addr, sigv_mm); sourcelist_args_free = linker.downcallHandle(ui_sourcelist_args_free_addr, sigv_m); + + textarea_args_new = linker.downcallHandle(ui_textarea_args_new_addr, sigm); + textarea_args_set_fill = linker.downcallHandle(ui_textarea_args_set_fill_addr, sigm); + textarea_args_set_hexpand = linker.downcallHandle(ui_textarea_args_set_hexpand_addr, sigv_mb); + textarea_args_set_vexpand = linker.downcallHandle(ui_textarea_args_set_vexpand_addr, sigv_mb); + textarea_args_set_hfill = linker.downcallHandle(ui_textarea_args_set_hfill_addr, sigv_mb); + textarea_args_set_vfill = linker.downcallHandle(ui_textarea_args_set_vfill_addr, sigv_mb); + textarea_args_set_override_defaults = linker.downcallHandle(ui_textarea_args_set_override_defaults_addr, sigv_mb); + textarea_args_set_colspan = linker.downcallHandle(ui_textarea_args_set_colspan_addr, sigv_mi); + textarea_args_set_rowspan = linker.downcallHandle(ui_textarea_args_set_rowspan_addr, sigv_mi); + textarea_args_set_name = linker.downcallHandle(ui_textarea_args_set_name_addr, sigv_mm); + textarea_args_set_style_class = linker.downcallHandle(ui_textarea_args_set_style_class_addr, sigv_mm); + textarea_args_set_varname = linker.downcallHandle(ui_textarea_args_set_varname_addr, sigv_mm); + textarea_args_set_value = linker.downcallHandle(ui_textarea_args_set_value_addr, sigv_mm); + textarea_args_set_onchange = linker.downcallHandle(ui_textarea_args_set_onchange_addr, sigv_mm); + textarea_args_set_onchangedata = linker.downcallHandle(ui_textarea_args_set_onchangedata_addr, sigv_mm); + textarea_args_set_groups = linker.downcallHandle(ui_textarea_args_set_groups_addr, sigv_mm); + textarea_args_free = linker.downcallHandle(ui_textarea_args_free_addr, sigv_m); + + textfield_args_new = linker.downcallHandle(ui_textfield_args_new_addr, sigm); + textfield_args_set_fill = linker.downcallHandle(ui_textfield_args_set_fill_addr, sigm); + textfield_args_set_hexpand = linker.downcallHandle(ui_textfield_args_set_hexpand_addr, sigv_mb); + textfield_args_set_vexpand = linker.downcallHandle(ui_textfield_args_set_vexpand_addr, sigv_mb); + textfield_args_set_hfill = linker.downcallHandle(ui_textfield_args_set_hfill_addr, sigv_mb); + textfield_args_set_vfill = linker.downcallHandle(ui_textfield_args_set_vfill_addr, sigv_mb); + textfield_args_set_override_defaults = linker.downcallHandle(ui_textfield_args_set_override_defaults_addr, sigv_mb); + textfield_args_set_colspan = linker.downcallHandle(ui_textfield_args_set_colspan_addr, sigv_mi); + textfield_args_set_rowspan = linker.downcallHandle(ui_textfield_args_set_rowspan_addr, sigv_mi); + textfield_args_set_name = linker.downcallHandle(ui_textfield_args_set_name_addr, sigv_mm); + textfield_args_set_style_class = linker.downcallHandle(ui_textfield_args_set_style_class_addr, sigv_mm); + textfield_args_set_varname = linker.downcallHandle(ui_textfield_args_set_varname_addr, sigv_mm); + textfield_args_set_value = linker.downcallHandle(ui_textfield_args_set_value_addr, sigv_mm); + textfield_args_set_onchange = linker.downcallHandle(ui_textfield_args_set_onchange_addr, sigv_mm); + textfield_args_set_onchangedata = linker.downcallHandle(ui_textfield_args_set_onchangedata_addr, sigv_mm); + textfield_args_set_onactivate = linker.downcallHandle(ui_textfield_args_set_onactivate_addr, sigv_mm); + textfield_args_set_onactivatedata = linker.downcallHandle(ui_textfield_args_set_onactivatedata_addr, sigv_mm); + textfield_args_set_groups = linker.downcallHandle(ui_textfield_args_set_groups_addr, sigv_mm); + textfield_args_free = linker.downcallHandle(ui_textfield_args_free_addr, sigv_m); } static ArgFuncs getInstance() { diff --git a/ui-java/src/main/java/de/unixwork/ui/ButtonBuilder.java b/ui-java/src/main/java/de/unixwork/ui/ButtonBuilder.java index ca41a93..32d669c 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ButtonBuilder.java +++ b/ui-java/src/main/java/de/unixwork/ui/ButtonBuilder.java @@ -29,6 +29,7 @@ public class ButtonBuilder extends AbstractWidgetBuilder { public ButtonBuilder(UiObject obj, MethodHandle widgetConstructor) { this.obj = obj; this.widgetConstructor = widgetConstructor; + this.argsFree = ArgFuncs.getInstance().button_args_free; } public ButtonBuilder fill(boolean fill) { diff --git a/ui-java/src/main/java/de/unixwork/ui/Text.java b/ui-java/src/main/java/de/unixwork/ui/Text.java new file mode 100644 index 0000000..819a40e --- /dev/null +++ b/ui-java/src/main/java/de/unixwork/ui/Text.java @@ -0,0 +1,23 @@ +package de.unixwork.ui; + +public class Text { + public static TextAreaBuilder textarea(UiObject obj) { + TextFuncs ui = TextFuncs.getInstance(); + return new TextAreaBuilder(obj, ui.textarea_create); + } + + public static TextFieldBuilder textfield(UiObject obj) { + TextFuncs ui = TextFuncs.getInstance(); + return new TextFieldBuilder(obj, ui.textfield_create); + } + + public static TextFieldBuilder passwordfield(UiObject obj) { + TextFuncs ui = TextFuncs.getInstance(); + return new TextFieldBuilder(obj, ui.passwordfield_create); + } + + public static TextFieldBuilder framelessTextfield(UiObject obj) { + TextFuncs ui = TextFuncs.getInstance(); + return new TextFieldBuilder(obj, ui.frameless_textfield_create); + } +} diff --git a/ui-java/src/main/java/de/unixwork/ui/TextAreaBuilder.java b/ui-java/src/main/java/de/unixwork/ui/TextAreaBuilder.java new file mode 100644 index 0000000..bc8dd43 --- /dev/null +++ b/ui-java/src/main/java/de/unixwork/ui/TextAreaBuilder.java @@ -0,0 +1,157 @@ +package de.unixwork.ui; + +import java.lang.foreign.Arena; +import java.lang.foreign.FunctionDescriptor; +import java.lang.foreign.MemorySegment; +import java.lang.foreign.ValueLayout; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + +public class TextAreaBuilder extends AbstractWidgetBuilder { + private boolean fill; + private boolean hexpand; + private boolean vexpand; + private boolean hfill; + private boolean vfill; + private boolean overrideDefaults; + private int colspan; + private int rowspan; + private String name; + private String styleClass; + private UiText value; + private String varname; + private EventHandler onChange; + private int[] states; + + public TextAreaBuilder(UiObject obj, MethodHandle widgetConstructor) { + this.obj = obj; + this.widgetConstructor = widgetConstructor; + this.argsFree = ArgFuncs.getInstance().textarea_args_free; + } + + public TextAreaBuilder fill(boolean fill) { + this.fill = fill; + return this; + } + + public TextAreaBuilder hexpand(boolean hexpand) { + this.hexpand = hexpand; + return this; + } + + public TextAreaBuilder vexpand(boolean vexpand) { + this.vexpand = vexpand; + return this; + } + + public TextAreaBuilder hfill(boolean hfill) { + this.hfill = hfill; + return this; + } + + public TextAreaBuilder vfill(boolean vfill) { + this.vfill = vfill; + return this; + } + + public TextAreaBuilder overrideDefaults(boolean overrideDefaults) { + this.overrideDefaults = overrideDefaults; + return this; + } + + public TextAreaBuilder colspan(int colspan) { + this.colspan = colspan; + return this; + } + + public TextAreaBuilder rowspan(int rowspan) { + this.rowspan = rowspan; + return this; + } + + public TextAreaBuilder name(String name) { + this.name = name; + return this; + } + + public TextAreaBuilder styleClass(String styleClass) { + this.styleClass = styleClass; + return this; + } + + public TextAreaBuilder value(UiText value) { + this.value = value; + return this; + } + + public TextAreaBuilder varname(String varname) { + this.varname = varname; + return this; + } + + public TextAreaBuilder onChange(EventHandler onChange) { + this.onChange = onChange; + return this; + } + + public TextAreaBuilder states(int... states) { + this.states = states; + return this; + } + + public MemorySegment createArgs(Arena arena) throws Throwable { + ArgFuncs ui = ArgFuncs.getInstance(); + + args = (MemorySegment)ui.textarea_args_new.invoke(); + if(fill) { + ui.textarea_args_set_fill.invoke(args, fill); + } + if(hexpand) { + ui.textarea_args_set_hexpand.invoke(args, hexpand); + } + if(vexpand) { + ui.textarea_args_set_vexpand.invoke(args, vexpand); + } + if(hfill) { + ui.textarea_args_set_hfill.invoke(args, hfill); + } + if(vfill) { + ui.textarea_args_set_vfill.invoke(args, vfill); + } + if(overrideDefaults) { + ui.textarea_args_set_override_defaults.invoke(args, overrideDefaults); + } + if(colspan > 0) { + ui.textarea_args_set_colspan.invoke(args, colspan); + } + if(rowspan > 0) { + ui.textarea_args_set_rowspan.invoke(args, rowspan); + } + if(name != null) { + MemorySegment cstr = arena.allocateFrom(name); + ui.textarea_args_set_name.invoke(args, cstr); + } + if(styleClass != null) { + MemorySegment cstr = arena.allocateFrom(styleClass); + ui.textarea_args_set_style_class.invoke(args, cstr); + } + + if(onChange != null) { + EventWrapper event = new EventWrapper(obj, onChange); + + // set toolkit args + ui.textarea_args_set_onchange.invoke(args, event.getCallback()); + ui.textarea_args_set_onchangedata.invoke(args, event.getUserData()); + } + if(varname != null) { + MemorySegment cstr = arena.allocateFrom(varname); + ui.textarea_args_set_varname.invoke(args, cstr); + } + if(value != null) { + ui.textarea_args_set_value.invoke(args, value.valuePtr); + } + + return args; + } +} diff --git a/ui-java/src/main/java/de/unixwork/ui/TextFieldBuilder.java b/ui-java/src/main/java/de/unixwork/ui/TextFieldBuilder.java new file mode 100644 index 0000000..7e46ef9 --- /dev/null +++ b/ui-java/src/main/java/de/unixwork/ui/TextFieldBuilder.java @@ -0,0 +1,171 @@ +package de.unixwork.ui; + +import java.lang.foreign.Arena; +import java.lang.foreign.FunctionDescriptor; +import java.lang.foreign.MemorySegment; +import java.lang.foreign.ValueLayout; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + +public class TextFieldBuilder extends AbstractWidgetBuilder { + private boolean fill; + private boolean hexpand; + private boolean vexpand; + private boolean hfill; + private boolean vfill; + private boolean overrideDefaults; + private int colspan; + private int rowspan; + private String name; + private String styleClass; + private UiString value; + private String varname; + private EventHandler onChange; + private EventHandler onActivate; + private int[] states; + + public TextFieldBuilder(UiObject obj, MethodHandle widgetConstructor) { + this.obj = obj; + this.widgetConstructor = widgetConstructor; + this.argsFree = ArgFuncs.getInstance().textfield_args_free; + } + + public TextFieldBuilder fill(boolean fill) { + this.fill = fill; + return this; + } + + public TextFieldBuilder hexpand(boolean hexpand) { + this.hexpand = hexpand; + return this; + } + + public TextFieldBuilder vexpand(boolean vexpand) { + this.vexpand = vexpand; + return this; + } + + public TextFieldBuilder hfill(boolean hfill) { + this.hfill = hfill; + return this; + } + + public TextFieldBuilder vfill(boolean vfill) { + this.vfill = vfill; + return this; + } + + public TextFieldBuilder overrideDefaults(boolean overrideDefaults) { + this.overrideDefaults = overrideDefaults; + return this; + } + + public TextFieldBuilder colspan(int colspan) { + this.colspan = colspan; + return this; + } + + public TextFieldBuilder rowspan(int rowspan) { + this.rowspan = rowspan; + return this; + } + + public TextFieldBuilder name(String name) { + this.name = name; + return this; + } + + public TextFieldBuilder styleClass(String styleClass) { + this.styleClass = styleClass; + return this; + } + + public TextFieldBuilder value(UiString value) { + this.value = value; + return this; + } + + public TextFieldBuilder varname(String varname) { + this.varname = varname; + return this; + } + + public TextFieldBuilder onChange(EventHandler onChange) { + this.onChange = onChange; + return this; + } + + public TextFieldBuilder onActivate(EventHandler onActivate) { + this.onActivate = onActivate; + return this; + } + + public TextFieldBuilder states(int... states) { + this.states = states; + return this; + } + + public MemorySegment createArgs(Arena arena) throws Throwable { + ArgFuncs ui = ArgFuncs.getInstance(); + + args = (MemorySegment)ui.textfield_args_new.invoke(); + if(fill) { + ui.textfield_args_set_fill.invoke(args, fill); + } + if(hexpand) { + ui.textfield_args_set_hexpand.invoke(args, hexpand); + } + if(vexpand) { + ui.textfield_args_set_vexpand.invoke(args, vexpand); + } + if(hfill) { + ui.textfield_args_set_hfill.invoke(args, hfill); + } + if(vfill) { + ui.textfield_args_set_vfill.invoke(args, vfill); + } + if(overrideDefaults) { + ui.textfield_args_set_override_defaults.invoke(args, overrideDefaults); + } + if(colspan > 0) { + ui.textfield_args_set_colspan.invoke(args, colspan); + } + if(rowspan > 0) { + ui.textfield_args_set_rowspan.invoke(args, rowspan); + } + if(name != null) { + MemorySegment cstr = arena.allocateFrom(name); + ui.textfield_args_set_name.invoke(args, cstr); + } + if(styleClass != null) { + MemorySegment cstr = arena.allocateFrom(styleClass); + ui.textfield_args_set_style_class.invoke(args, cstr); + } + + if(onChange != null) { + EventWrapper event = new EventWrapper(obj, onChange); + + // set toolkit args + ui.textfield_args_set_onchange.invoke(args, event.getCallback()); + ui.textfield_args_set_onchangedata.invoke(args, event.getUserData()); + } + if(varname != null) { + MemorySegment cstr = arena.allocateFrom(varname); + ui.textfield_args_set_varname.invoke(args, cstr); + } + if(value != null) { + ui.textfield_args_set_value.invoke(args, value.valuePtr); + } + + if(onActivate != null) { + EventWrapper event = new EventWrapper(obj, onActivate); + + // set toolkit args + ui.textfield_args_set_onactivate.invoke(args, event.getCallback()); + ui.textfield_args_set_onactivatedata.invoke(args, event.getUserData()); + } + + return args; + } +} diff --git a/ui-java/src/main/java/de/unixwork/ui/TextFuncs.java b/ui-java/src/main/java/de/unixwork/ui/TextFuncs.java new file mode 100644 index 0000000..dc50ae9 --- /dev/null +++ b/ui-java/src/main/java/de/unixwork/ui/TextFuncs.java @@ -0,0 +1,39 @@ +package de.unixwork.ui; + +import java.lang.foreign.*; +import java.lang.invoke.MethodHandle; + +public class TextFuncs { + static TextFuncs instance; + + public MethodHandle textarea_create; + public MethodHandle textfield_create; + public MethodHandle frameless_textfield_create; + public MethodHandle passwordfield_create; + public MethodHandle path_textfield_create; + + private TextFuncs(Linker linker, SymbolLookup lib) { + // void* func(void*, void*) + FunctionDescriptor sigm_mm = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS); + + MemorySegment ui_textarea_create_addr = lib.find("ui_textarea_create").orElseThrow(); + MemorySegment ui_textfield_create_addr = lib.find("ui_textfield_create").orElseThrow(); + MemorySegment ui_frameless_textfield_create_addr = lib.find("ui_frameless_textfield_create").orElseThrow(); + MemorySegment ui_passwordfield_create_addr = lib.find("ui_passwordfield_create").orElseThrow(); + MemorySegment ui_path_textfield_create_addr = lib.find("ui_path_textfield_create").orElseThrow(); + + textarea_create = linker.downcallHandle(ui_textarea_create_addr, sigm_mm); + textfield_create = linker.downcallHandle(ui_textfield_create_addr, sigm_mm); + frameless_textfield_create = linker.downcallHandle(ui_frameless_textfield_create_addr, sigm_mm); + passwordfield_create = linker.downcallHandle(ui_passwordfield_create_addr, sigm_mm); + path_textfield_create = linker.downcallHandle(ui_path_textfield_create_addr, sigm_mm); + } + + static TextFuncs getInstance() { + if (instance == null) { + Toolkit toolkit = Toolkit.getInstance(); + instance = new TextFuncs(toolkit.getLinker(), toolkit.getSymbolLookup()); + } + return instance; + } +}