From 5cd8cf6edaa2a3c3de65a04d7eac1bf140f0b30f Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Fri, 19 Jun 2026 17:42:15 +0200 Subject: [PATCH] use icon ids instead of paltform specific icon names --- .../main/kotlin/de/unixwork/rssreader/App.kt | 9 +- .../de/unixwork/rssreader/MainWindow.kt | 5 +- .../main/java/de/unixwork/ui/IconName.java | 94 +++++++++++++++++++ .../java/de/unixwork/ui/ToolkitFuncs.java | 7 ++ 4 files changed, 109 insertions(+), 6 deletions(-) create mode 100644 ui-java/src/main/java/de/unixwork/ui/IconName.java 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 de021aa..2a1c7b7 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/App.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/App.kt @@ -1,6 +1,7 @@ package de.unixwork.rssreader import de.unixwork.ui.Application +import de.unixwork.ui.IconName import de.unixwork.ui.ToolbarPosition import de.unixwork.ui.Toolkit import de.unixwork.ui.kotlin.ToolkitDispatcher @@ -144,17 +145,17 @@ object App : Application { } fun initToolbar() { - toolbarItem(name = "reloadFeed", icon = "view-refresh", tooltip = "Refresh current feed") { event -> + toolbarItem(name = "reloadFeed", icon = IconName.REFRESH.toString(), tooltip = "Refresh current feed") { event -> syncCurrent() } - toolbarItem(name = "markCurrentFeed", icon = "checkbox-checked", tooltip = "Mark items in this feed as read") { event -> + toolbarItem(name = "markCurrentFeed", icon = IconName.CHECKBOX.toString(), tooltip = "Mark items in this feed as read") { event -> markCurrentFeedAsRead() } - toolbarToggleItem(name = "starred", icon = "starred", varname = "starred", tooltip = "Star the current item") { event -> + toolbarToggleItem(name = "starred", icon = IconName.STAR.toString(), varname = "starred", tooltip = "Star the current item") { event -> setBookmark(event.intValue == 1) } - toolbarToggleItem(name = "preview", icon = "view-reveal", varname = "browser", tooltip = "Open the current item uri in the internal webview") { event -> + toolbarToggleItem(name = "preview", icon = IconName.VIEW_REVEAL.toString(), varname = "browser", tooltip = "Open the current item uri in the internal webview") { event -> window?.feedList?.updateWebView() } 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 7badc9e..8aaa807 100644 --- a/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt +++ b/rss-application/src/main/kotlin/de/unixwork/rssreader/MainWindow.kt @@ -2,6 +2,7 @@ package de.unixwork.rssreader import de.unixwork.ui.UiObject import de.unixwork.ui.ColumnType +import de.unixwork.ui.IconName import de.unixwork.ui.LabelStyle import de.unixwork.ui.SubListItem import de.unixwork.ui.TableModel @@ -241,10 +242,10 @@ class MainWindow() { item } hbox(margin = 4, spacing = 4) { - button(icon = "list-add", states = intArrayOf(HAS_FOLDERS)) { + button(icon = IconName.ADD.toString(), states = intArrayOf(HAS_FOLDERS)) { createFeedDialog() } - button(icon = "folder-new") { + button(icon = IconName.NEW_FOLDER.toString()) { createCategoryDialog() } } diff --git a/ui-java/src/main/java/de/unixwork/ui/IconName.java b/ui-java/src/main/java/de/unixwork/ui/IconName.java new file mode 100644 index 0000000..b150f95 --- /dev/null +++ b/ui-java/src/main/java/de/unixwork/ui/IconName.java @@ -0,0 +1,94 @@ +package de.unixwork.ui; + +import java.lang.foreign.MemorySegment; + +public enum IconName { + HOME(0), + NEW_WINDOW(1), + NEW_TAB(2), + NEW_FOLDER(3), + NEW_DOCUMENT(4), + NEW_APPOINTMENT(5), + NEW_CHAT_MESSAGE(6), + NEW_CONTACT(7), + NEW_MAIL(8), + ADD_BOOKMARK(9), + ADD_IMAGE(10), + ADD_LINK(11), + ADD_TEXT(12), + ADD(13), + REMOVE(14), + REFRESH(15), + UPLOAD(16), + SAVE_LOCAL(17), + EDIT_COPY(18), + EDIT_CUT(19), + EDIT_DELETE(20), + EDIT_PASTE(21), + UNDO(22), + REDO(23), + SIDEBAR_LEFT(24), + SIDEBAR_RIGHT(25), + GO_BACK(26), + GO_FORWARD(27), + GO_UP(28), + GO_DOWN(29), + VIEW_LIST(30), + VIEW_GRID(31), + VIEW_DUAL(32), + VIEW_FULLSCREEN(33), + VIEW_RESTORE(34), + TEXT_BOLD(35), + TEXT_ITALIC(36), + TEXT_UNDERLINE(37), + LIST_BULLET(38), + LIST_ORDERED(39), + LIST_CHECK(40), + CHECKBOX(41), + STAR(42), + VIEW_REVEAL(43), + VIEW_CONCEAL(44), + SETTINGS(45), + MEDIA_PLAY(46), + MEDIA_STOP(47), + MEDIA_PAUSE(48), + MEDIA_SEEK_BACKWARD(49), + MEDIA_SEEK_FORWARD(50), + MEDIA_SKIP_BACKWARD(51), + MEDIA_SKIP_FORWARD(52), + CALL_START(53), + CALL_STOP(54), + CALL_INCOMING(55), + CALL_OUTGOING(56), + MICROPHONE_ON(57), + MICROPHONE_OFF(58), + LOCKED(59), + UNLOCKED(60), + SECURE(61), + INSECURE(62); + + private final int value; + + IconName(int value) { + this.value = value; + } + + public int value() { + return value; + } + + public String toString() { + var ui = ToolkitFuncs.getInstance(); + try { + MemorySegment cstr = (MemorySegment)ui.icon_name.invoke(value); + if(cstr.address() == 0) { + return ""; + } + long length = (long)ui.strlen.invoke(cstr); + cstr = cstr.reinterpret(length+1); + return cstr.getString(0); + } 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 8a07f23..e764840 100644 --- a/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java +++ b/ui-java/src/main/java/de/unixwork/ui/ToolkitFuncs.java @@ -119,6 +119,8 @@ public class ToolkitFuncs { public MethodHandle set_widget_groups2; public MethodHandle set_widget_visibility_states; + public MethodHandle icon_name; + public MethodHandle set_state; public MethodHandle unset_state; @@ -140,6 +142,7 @@ public class ToolkitFuncs { private ToolkitFuncs(Linker linker, SymbolLookup lib) { FunctionDescriptor sigm = FunctionDescriptor.of(ValueLayout.ADDRESS); FunctionDescriptor sigm_m = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS); + FunctionDescriptor sigm_i = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.JAVA_INT); FunctionDescriptor sigi_m = FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.ADDRESS); FunctionDescriptor sigl_m = FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS); FunctionDescriptor sigm_mm = FunctionDescriptor.of(ValueLayout.ADDRESS, ValueLayout.ADDRESS, ValueLayout.ADDRESS); @@ -271,6 +274,8 @@ public class ToolkitFuncs { MemorySegment ui_widget_set_states2_addr = lib.find("ui_widget_set_states2").orElseThrow(); MemorySegment ui_widget_set_visibility_states_addr = lib.find("ui_widget_set_visibility_states").orElseThrow(); + MemorySegment ui_icon_name_addr = lib.find("ui_icon_name").orElseThrow(); + MemorySegment set_state_addr = lib.find("ui_set_state").orElseThrow(); MemorySegment unset_state_addr = lib.find("ui_unset_state").orElseThrow(); @@ -395,6 +400,8 @@ public class ToolkitFuncs { set_widget_groups2 = linker.downcallHandle(ui_widget_set_states2_addr, sigv_mmmmi); set_widget_visibility_states = linker.downcallHandle(ui_widget_set_visibility_states_addr, sigv_mmmi); + icon_name = linker.downcallHandle(ui_icon_name_addr, sigm_i); + set_state = linker.downcallHandle(set_state_addr, sigv_mi); unset_state = linker.downcallHandle(unset_state_addr, sigv_mi); -- 2.52.0