From: Olaf Wintermann Date: Sun, 14 Sep 2025 17:03:26 +0000 (+0200) Subject: remember window size X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=f97721bde9de1520d7001ca6c78a6f3e4fb1358a;p=rssreader.git remember window size --- diff --git a/rss-application/src/main/kotlin/de/unixwork/rssreader/App.kt b/rss-application/src/main/kotlin/de/unixwork/rssreader/App.kt index 2ffa125..12fd670 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/App.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/App.kt @@ -90,6 +90,7 @@ object App : Application { } override fun shutdown() { + Toolkit.saveSettings() System.exit(0) } diff --git a/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt b/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt index 2f500f2..3166980 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt @@ -11,6 +11,7 @@ import de.unixwork.ui.kotlin.Toplevel 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 @@ -28,7 +29,8 @@ class MainWindow() { 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( diff --git a/ui-java/src/main/java/de/unixwork/ui/Toolkit.java b/ui-java/src/main/java/de/unixwork/ui/Toolkit.java index 5ae476b..f6cc63e 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Toolkit.java +++ b/ui-java/src/main/java/de/unixwork/ui/Toolkit.java @@ -30,6 +30,9 @@ public class Toolkit { private SymbolLookup lib; private MethodHandle mainFunc; + private MethodHandle app_save_settings; + private MethodHandle app_exit_on_shutdown; + private ArrayList eventHandlers = new ArrayList<>(); private HashMap onshotEventHandlers = new HashMap<>(); @@ -73,6 +76,14 @@ public class Toolkit { 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) { @@ -92,10 +103,18 @@ public class Toolkit { 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( @@ -277,6 +296,22 @@ public class Toolkit { 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) { diff --git a/ui-java/src/main/java/de/unixwork/ui/UiObject.java b/ui-java/src/main/java/de/unixwork/ui/UiObject.java index db031e6..f55031b 100644 --- a/ui-java/src/main/java/de/unixwork/ui/UiObject.java +++ b/ui-java/src/main/java/de/unixwork/ui/UiObject.java @@ -66,6 +66,14 @@ public class UiObject extends Context { return UiObjectFuncs.instance.simpleWindow(title); } + public static void setDefaultWindowSize(int width, int height) { + try { + UiObjectFuncs.instance.ui_window_default_size.invoke(width, height); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + public void show() { UiObjectFuncs.instance.show(this); } diff --git a/ui-java/src/main/java/de/unixwork/ui/UiObjectFuncs.java b/ui-java/src/main/java/de/unixwork/ui/UiObjectFuncs.java index 8febc50..f849018 100644 --- a/ui-java/src/main/java/de/unixwork/ui/UiObjectFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/UiObjectFuncs.java @@ -17,6 +17,7 @@ class UiObjectFuncs { public MethodHandle ui_savefiledialog; public MethodHandle ui_window_size; + public MethodHandle ui_window_default_size; private UiObjectFuncs(Linker linker, SymbolLookup lib) { @@ -41,6 +42,7 @@ class UiObjectFuncs { 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); @@ -53,6 +55,7 @@ class UiObjectFuncs { 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 diff --git a/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Window.kt b/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Window.kt index 35c2d19..4eefe33 100644 --- a/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Window.kt +++ b/ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Window.kt @@ -153,3 +153,7 @@ fun saveFileDialog( ) { Dialog.saveFileDialog(parent, name, callback) } + +fun setDefaultWindowSize(width: Int, height: Int) { + UiObject.setDefaultWindowSize(width, height) +}