public Arena getArena() {
return arena;
}
+
+ public int getInt(String name) {
+ return (int)getLong(name);
+ }
+
+ public long getLong(String name) {
+ ToolkitFuncs ui = ToolkitFuncs.getInstance();
+ try (Arena arena = Arena.ofConfined()) {
+ MemorySegment nameCstr = arena.allocateFrom(name);
+ return (long)ui.ui_var_get_int.invoke(ptr, nameCstr);
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void setInt(String name, int value) {
+ setLong(name, value);
+ }
+
+ public void setLong(String name, long value) {
+ ToolkitFuncs ui = ToolkitFuncs.getInstance();
+ try (Arena arena = Arena.ofConfined()) {
+ MemorySegment nameCstr = arena.allocateFrom(name);
+ ui.ui_var_set_int.invoke(ptr, nameCstr, value);
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public String getString(String name) {
+ ToolkitFuncs ui = ToolkitFuncs.getInstance();
+ try (Arena arena = Arena.ofConfined()) {
+ MemorySegment nameCstr = arena.allocateFrom(name);
+ MemorySegment cstr = (MemorySegment) ui.ui_var_get_string.invoke(ptr, nameCstr);
+ if(cstr.address() == 0) {
+ return "";
+ }
+ long length = (long)ui.strlen.invoke(cstr);
+ cstr = cstr.reinterpret(length+1);
+ if (cstr != null && cstr.address() != 0) {
+ return cstr.getString(0);
+ }
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
+ }
+ return "";
+ }
+
+ public void setString(String name, String value) {
+ ToolkitFuncs ui = ToolkitFuncs.getInstance();
+ if(value == null) {
+ value = "";
+ }
+ try (Arena arena = Arena.ofConfined()) {
+ MemorySegment nameCstr = arena.allocateFrom(name);
+ MemorySegment cstr = arena.allocateFrom(value);
+ ui.ui_var_set_string.invoke(ptr, nameCstr, cstr);
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
+ }
+ }
}
package de.unixwork.ui;
+import com.sun.jdi.Value;
+
import java.lang.foreign.*;
import java.lang.invoke.MethodHandle;
+import java.util.function.Function;
public class ToolkitFuncs {
static ToolkitFuncs instance;
public MethodHandle text_set;
public MethodHandle text_get;
+ public MethodHandle ui_var_set_int;
+ public MethodHandle ui_var_get_int;
+ public MethodHandle ui_var_set_double;
+ public MethodHandle ui_var_get_double;
+ public MethodHandle ui_var_set_string;
+ public MethodHandle ui_var_get_string;
+
+ public MethodHandle ui_get_int_var;
+ public MethodHandle ui_get_double_var;
+ public MethodHandle ui_get_string_var;
+ public MethodHandle ui_get_text_var;
+ public MethodHandle ui_get_range_var;
+ public MethodHandle ui_get_list_var;
+ public MethodHandle ui_get_generic_var;
+
public MethodHandle model_new;
public MethodHandle model_add_column;
public MethodHandle model_free;
FunctionDescriptor sigl_m = FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS);
FunctionDescriptor sigm_mm = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS);
FunctionDescriptor sigv_mm = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS);
+ FunctionDescriptor sigv_mml = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.JAVA_LONG);
+ FunctionDescriptor sigl_mm = FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS, ValueLayout.ADDRESS);
+ FunctionDescriptor sigv_mmd = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.JAVA_DOUBLE);
+ FunctionDescriptor sigd_mm = FunctionDescriptor.of(ValueLayout.JAVA_DOUBLE, ValueLayout.ADDRESS, ValueLayout.ADDRESS);
+ FunctionDescriptor sigv_mmm = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS);
FunctionDescriptor sigm_ml = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.JAVA_LONG);
FunctionDescriptor sigm_mi = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.JAVA_INT);
FunctionDescriptor sigv_mb = FunctionDescriptor.ofVoid(ValueLayout.ADDRESS, ValueLayout.JAVA_BOOLEAN);
MemorySegment range_set_extent_addr = lib.find("ui_range_set_extent").orElseThrow();
MemorySegment range_get_extent_addr = lib.find("ui_range_get_extent").orElseThrow();
+ MemorySegment var_set_int_addr = lib.find("ui_var_set_int").orElseThrow();
+ MemorySegment var_get_int_addr = lib.find("ui_var_get_int").orElseThrow();
+ MemorySegment var_set_double_addr = lib.find("ui_var_set_double").orElseThrow();
+ MemorySegment var_get_double_addr = lib.find("ui_var_get_double").orElseThrow();
+ MemorySegment var_set_string_addr = lib.find("ui_var_set_string").orElseThrow();
+ MemorySegment var_get_string_addr = lib.find("ui_var_get_string").orElseThrow();
+
+ MemorySegment get_int_var_addr = lib.find("ui_get_int_var").orElseThrow();
+ MemorySegment get_double_var_addr = lib.find("ui_get_double_var").orElseThrow();
+ MemorySegment get_string_var_addr = lib.find("ui_get_string_var").orElseThrow();
+ MemorySegment get_text_var_addr = lib.find("ui_get_text_var").orElseThrow();
+ MemorySegment get_range_var_addr = lib.find("ui_get_range_var").orElseThrow();
+ MemorySegment get_list_var_addr = lib.find("ui_get_list_var").orElseThrow();
+ MemorySegment get_generic_var_addr = lib.find("ui_get_generic_var").orElseThrow();
+
MemorySegment model_new_addr = lib.find("ui_model_new").orElseThrow();
MemorySegment model_add_column_addr = lib.find("ui_model_add_column").orElseThrow();
MemorySegment model_free_addr = lib.find("ui_model_free").orElseThrow();
range_set_extent = linker.downcallHandle(range_set_extent_addr, sigv_md);
range_get_extent = linker.downcallHandle(range_get_extent_addr, sigd_m);
+ ui_var_set_int = linker.downcallHandle(var_set_int_addr, sigv_mml);
+ ui_var_get_int = linker.downcallHandle(var_get_int_addr, sigl_mm);
+ ui_var_set_double = linker.downcallHandle(var_set_double_addr, sigv_mmd);
+ ui_var_get_double = linker.downcallHandle(var_get_double_addr, sigd_mm);
+ ui_var_set_string = linker.downcallHandle(var_set_string_addr, sigv_mmm);
+ ui_var_get_string = linker.downcallHandle(var_get_string_addr, sigm_mm);
+
+ ui_get_int_var = linker.downcallHandle(get_int_var_addr, sigm_mm);
+ ui_get_double_var = linker.downcallHandle(get_double_var_addr, sigm_mm);
+ ui_get_string_var = linker.downcallHandle(get_string_var_addr, sigm_mm);
+ ui_get_text_var = linker.downcallHandle(get_text_var_addr, sigm_mm);
+ ui_get_range_var = linker.downcallHandle(get_range_var_addr, sigm_mm);
+ ui_get_list_var = linker.downcallHandle(get_list_var_addr, sigm_mm);
+ ui_get_generic_var = linker.downcallHandle(get_generic_var_addr, sigm_mm);
+
model_new = linker.downcallHandle(model_new_addr, sigm_m);
model_add_column = linker.downcallHandle(model_add_column_addr, sigv_mimi);
model_free = linker.downcallHandle(model_free_addr, sigv_m);