]> uap-core.de Git - rssreader.git/commitdiff
implement "open in browser" menu item
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 6 May 2026 19:56:10 +0000 (21:56 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Wed, 6 May 2026 19:56:10 +0000 (21:56 +0200)
rss-application/src/main/kotlin/de/unixwork/rssreader/FeedList.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/ToolkitFuncs.java

index b77e8cb3e6a7fa627c22371adabf85e6796bd719..98ee71a3d4804c3fbc7de4fb0b72ac8e620d7be6 100644 (file)
@@ -1,6 +1,7 @@
 package de.unixwork.rssreader
 
 import de.unixwork.ui.Document
+import de.unixwork.ui.Toolkit
 import de.unixwork.ui.UiLinkData
 import de.unixwork.ui.kotlin.ToolkitDispatcher
 import kotlinx.coroutines.Dispatchers
@@ -232,4 +233,12 @@ class FeedList(window: MainWindow) : Document() {
             items.update(items.selectedIndex)
         }
     }
+
+    fun openCurrentUri() {
+        currentItem?.let { item ->
+            item.link?.let {
+                Toolkit.openUri(it)
+            }
+        }
+    }
 }
\ No newline at end of file
index 700ff192713df9646937b54f115b262fe7c98be8..da130061cce1988cfa52028fb84756dce9773f2d 100644 (file)
@@ -46,7 +46,7 @@ class MainWindow() {
             feedList.updateCurrentReadStatus(false)
         }
         menuItem("Open in browser") { event ->
-
+            feedList.openCurrentUri();
         }
         menuItem("Delete") { event ->
 
index 0e2a7298bad8b0b0671bfcb3df3ecce703fa7ade..684cc9ee6ca191dcb07baeacc002d99e6fda7e7c 100644 (file)
@@ -840,4 +840,14 @@ public class Toolkit {
             throw new RuntimeException(e);
         }
     }
+
+    public static void openUri(String uri) {
+        ToolkitFuncs ui = ToolkitFuncs.getInstance();
+        try(Arena arena = Arena.ofConfined()) {
+            MemorySegment uriCstr = arena.allocateFrom(uri);
+            ui.open_uri.invoke(uriCstr);
+        } catch (Throwable e) {
+            throw new RuntimeException(e);
+        }
+    }
 }
index 8e47f0458130303dd4c8e86305f906dbf7675d5e..8a07f23d3b4c79f53b323c6585e87ad8efa07013 100644 (file)
@@ -130,6 +130,8 @@ public class ToolkitFuncs {
     public MethodHandle getappdir;
     public MethodHandle configfile;
 
+    public MethodHandle open_uri;
+
     // some libc stuff
     public MethodHandle malloc;
     public MethodHandle free;
@@ -280,6 +282,8 @@ public class ToolkitFuncs {
         MemorySegment getappdir_addr = lib.find("ui_getappdir").orElseThrow();
         MemorySegment configfile_addr = lib.find("ui_configfile").orElseThrow();
 
+        MemorySegment open_uri_addr = lib.find("ui_open_uri").orElseThrow();
+
         MemorySegment malloc_addr = lib.find("malloc").orElseThrow();
         MemorySegment free_addr = lib.find("free").orElseThrow();
         MemorySegment strlen_addr = lib.find("strlen").orElseThrow();
@@ -399,6 +403,8 @@ public class ToolkitFuncs {
         getappdir = linker.downcallHandle(getappdir_addr, sigm);
         configfile = linker.downcallHandle(configfile_addr, sigm_m);
 
+        open_uri = linker.downcallHandle(open_uri_addr, sigv_m);
+
         ui_malloc = linker.downcallHandle(ui_malloc_addr, sigm_ml);
         ui_free = linker.downcallHandle(ui_free_addr, sigv_mm);