From: Olaf Wintermann Date: Wed, 6 May 2026 19:56:10 +0000 (+0200) Subject: implement "open in browser" menu item X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=3dd486947c3da1dc266461c7c8f2c7bce9e215c9;p=rssreader.git implement "open in browser" menu item --- diff --git a/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedList.kt b/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedList.kt index b77e8cb..98ee71a 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedList.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/FeedList.kt @@ -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 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 700ff19..da13006 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt @@ -46,7 +46,7 @@ class MainWindow() { feedList.updateCurrentReadStatus(false) } menuItem("Open in browser") { event -> - + feedList.openCurrentUri(); } menuItem("Delete") { event -> 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 0e2a729..684cc9e 100644 --- a/ui-java/src/main/java/de/unixwork/ui/Toolkit.java +++ b/ui-java/src/main/java/de/unixwork/ui/Toolkit.java @@ -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); + } + } } diff --git a/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java b/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java index 8e47f04..8a07f23 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java @@ -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);