import de.unixwork.ui.kotlin.sidebarWindow
import de.unixwork.ui.kotlin.dialogWindow
import de.unixwork.ui.kotlin.openFileDialog
+import de.unixwork.ui.kotlin.setDefaultWindowSize
import java.time.LocalDate
import java.time.ZoneId
import java.time.format.DateTimeFormatter
var currentFeedIndex = -1
init {
- window = sidebarWindow(title = "RSS Reader", width = 1600, height = 1000) {
+ setDefaultWindowSize(1600, 900)
+ window = sidebarWindow(title = "RSS Reader") {
sidebar {
vbox(fill = true) {
sourcelist(
private SymbolLookup lib;
private MethodHandle mainFunc;
+ private MethodHandle app_save_settings;
+ private MethodHandle app_exit_on_shutdown;
+
private ArrayList<EventHandler> eventHandlers = new ArrayList<>();
private HashMap<Long, EventHandler> onshotEventHandlers = new HashMap<>();
initFunctions();
UiObjectFuncs.init(linker, lib);
+
+ try {
+ // This forces exit(0) after the event loop is finished
+ // Without this, the JVM can crash for some reason
+ app_exit_on_shutdown.invoke(true);
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
+ }
}
public void setIsObjRegEnabled(boolean value) {
FunctionDescriptor sigm_m = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS); // void* func(void*)
FunctionDescriptor sigm_mi = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.JAVA_INT); // void* func(void*, int)
FunctionDescriptor sigi_m = FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.ADDRESS); // int func(void*)
+ FunctionDescriptor sigv = FunctionDescriptor.ofVoid();
+ FunctionDescriptor sigv_b = FunctionDescriptor.ofVoid(ValueLayout.JAVA_BOOLEAN);
MemorySegment ui_main_addr = lib.find("ui_main").orElseThrow();
mainFunc = linker.downcallHandle(ui_main_addr, sigv_v);
+ MemorySegment app_save_settings_addr = lib.find("ui_app_save_settings").orElseThrow();
+ MemorySegment app_exit_on_shutdown_addr = lib.find("ui_app_exit_on_shutdown").orElseThrow();
+
+ app_save_settings = linker.downcallHandle(app_save_settings_addr, sigv);
+ app_exit_on_shutdown = linker.downcallHandle(app_exit_on_shutdown_addr, sigv_b);
+
// init java based UiList implementation
try {
MethodHandle listFirstMethod = MethodHandles.lookup().findStatic(
Linker getLinker() {
return linker;
}
+
+ public static void setExitOnShutdown(boolean value) {
+ try {
+ Toolkit.getInstance().app_exit_on_shutdown.invoke(value);
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static void saveSettings() {
+ try {
+ Toolkit.getInstance().app_save_settings.invoke();
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
+ }
+ }
public static void init(String appName) {
if(Toolkit.instance != null) {
public MethodHandle ui_savefiledialog;
public MethodHandle ui_window_size;
+ public MethodHandle ui_window_default_size;
private UiObjectFuncs(Linker linker, SymbolLookup lib) {
MemorySegment ui_savefiledialog_addr = lib.find("ui_savefiledialog").orElseThrow();
MemorySegment ui_window_size_addr = lib.find("ui_window_size").orElseThrow();
+ MemorySegment ui_window_default_size_addr = lib.find("ui_window_default_size").orElseThrow();
ui_show = linker.downcallHandle(ui_show_addr, sigv_m);
ui_close = linker.downcallHandle(ui_close_addr, sigv_m);
ui_savefiledialog = linker.downcallHandle(ui_savefiledialog_addr, sigv_mmmm);
ui_window_size = linker.downcallHandle(ui_window_size_addr, sigv_mii);
+ ui_window_default_size = linker.downcallHandle(ui_window_default_size_addr, FunctionDescriptor.ofVoid(ValueLayout.JAVA_INT, ValueLayout.JAVA_INT));
}
// must be called by the Toolkit constructor