]> uap-core.de Git - rssreader.git/commitdiff
remember window size
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 14 Sep 2025 17:03:26 +0000 (19:03 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 14 Sep 2025 17:03:26 +0000 (19:03 +0200)
rss-application/src/main/kotlin/de/unixwork/rssreader/App.kt
rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt
ui-java/src/main/java/de/unixwork/ui/Toolkit.java
ui-java/src/main/java/de/unixwork/ui/UiObject.java
ui-java/src/main/java/de/unixwork/ui/UiObjectFuncs.java
ui-kotlin/src/main/kotlin/de/unixwork/ui/kotlin/Window.kt

index 2ffa1256f3d258590d5b6a2ee316d94ac7f9b194..12fd670e4e431e907a61ddf8905f1de72b5e2b36 100644 (file)
@@ -90,6 +90,7 @@ object App : Application {
     }
 
     override fun shutdown() {
+        Toolkit.saveSettings()
         System.exit(0)
     }
 
index 2f500f24599c9588817301efbf580df1a2fa3ed6..31669803e478dbe0fac372c07f45f643262c527b 100644 (file)
@@ -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(
index 5ae476b9ce57b93cd21d96f90604a6685cfb9840..f6cc63e179739a3499125ddab6a71f7b5d96026e 100644 (file)
@@ -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<EventHandler> eventHandlers = new ArrayList<>();
     private HashMap<Long, EventHandler> 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) {
index db031e69f03429e389c1d002588553ca5db87604..f55031b48c633f723c53299917c1713b1f670d94 100644 (file)
@@ -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);
     }
index 8febc50e7414b22f3fb1a0d8be9dd468a44816cb..f849018c660f62a17a6e32c27cf916142c24e25c 100644 (file)
@@ -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
index 35c2d1904424ac36c01f095a3fb62bf08071805e..4eefe33a1e535884b33be709a029ff7baba838d1 100644 (file)
@@ -153,3 +153,7 @@ fun saveFileDialog(
 ) {
     Dialog.saveFileDialog(parent, name, callback)
 }
+
+fun setDefaultWindowSize(width: Int, height: Int) {
+    UiObject.setDefaultWindowSize(width, height)
+}