add ui_add_action (Cocoa) default tip

Mon, 20 Apr 2026 21:19:13 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 20 Apr 2026 21:19:13 +0200
changeset 1098
1f45788e0bac
parent 1097
d44c895e9ee9

add ui_add_action (Cocoa)

.hgignore file | annotate | diff | comparison | revisions
make/xcode/toolkit/toolkit.xcodeproj/project.pbxproj file | annotate | diff | comparison | revisions
ui/cocoa/action.h file | annotate | diff | comparison | revisions
ui/cocoa/action.m file | annotate | diff | comparison | revisions
ui/cocoa/objs.mk file | annotate | diff | comparison | revisions
--- a/.hgignore	Sun Apr 19 20:05:11 2026 +0200
+++ b/.hgignore	Mon Apr 20 21:19:13 2026 +0200
@@ -12,3 +12,4 @@
 relre:^.idea/.*
 relre:^compile_commands.json$
 relre:^application/app.res$
+relre:.DS_Store
--- a/make/xcode/toolkit/toolkit.xcodeproj/project.pbxproj	Sun Apr 19 20:05:11 2026 +0200
+++ b/make/xcode/toolkit/toolkit.xcodeproj/project.pbxproj	Mon Apr 20 21:19:13 2026 +0200
@@ -9,6 +9,8 @@
 /* Begin PBXBuildFile section */
 		ED18C9232E76CA5500B64EA5 /* entry.m in Sources */ = {isa = PBXBuildFile; fileRef = ED18C9222E76CA5500B64EA5 /* entry.m */; };
 		ED2F55AE2E34FAD800A84793 /* Toolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = ED2F55AD2E34FAD800A84793 /* Toolbar.m */; };
+		ED3EDBD82F96B1910096E507 /* action.m in Sources */ = {isa = PBXBuildFile; fileRef = ED3EDBD72F96B1910096E507 /* action.m */; };
+		ED3EDBF42F96B2F80096E507 /* action.c in Sources */ = {isa = PBXBuildFile; fileRef = ED3EDBF32F96B2F80096E507 /* action.c */; };
 		ED52BFB02D86FC5D00FD8BE5 /* text.m in Sources */ = {isa = PBXBuildFile; fileRef = ED52BFAF2D86FC5D00FD8BE5 /* text.m */; };
 		ED6580EE2CFF19F900F5402F /* context.c in Sources */ = {isa = PBXBuildFile; fileRef = ED6580DD2CFF19F900F5402F /* context.c */; };
 		ED6580EF2CFF19F900F5402F /* menu.c in Sources */ = {isa = PBXBuildFile; fileRef = ED6580E12CFF19F900F5402F /* menu.c */; };
@@ -66,35 +68,39 @@
 /* End PBXBuildFile section */
 
 /* Begin PBXFileReference section */
-		ED18C9212E76CA5500B64EA5 /* entry.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = entry.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/entry.h; sourceTree = "<absolute>"; };
-		ED18C9222E76CA5500B64EA5 /* entry.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = entry.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/entry.m; sourceTree = "<absolute>"; };
-		ED2F55AC2E34FAD800A84793 /* Toolbar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Toolbar.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/Toolbar.h; sourceTree = "<absolute>"; };
-		ED2F55AD2E34FAD800A84793 /* Toolbar.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Toolbar.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/Toolbar.m; sourceTree = "<absolute>"; };
-		ED52BFAE2D86FC5D00FD8BE5 /* text.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = text.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/text.h; sourceTree = "<absolute>"; };
-		ED52BFAF2D86FC5D00FD8BE5 /* text.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = text.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/text.m; sourceTree = "<absolute>"; };
+		ED18C9212E76CA5500B64EA5 /* entry.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = entry.h; path = ../../../ui/cocoa/entry.h; sourceTree = "<absolute>"; };
+		ED18C9222E76CA5500B64EA5 /* entry.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = entry.m; path = ../../../ui/cocoa/entry.m; sourceTree = "<absolute>"; };
+		ED2F55AC2E34FAD800A84793 /* Toolbar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Toolbar.h; path = ../../../ui/cocoa/Toolbar.h; sourceTree = "<absolute>"; };
+		ED2F55AD2E34FAD800A84793 /* Toolbar.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Toolbar.m; path = ../../../ui/cocoa/Toolbar.m; sourceTree = "<absolute>"; };
+		ED3EDBD72F96B1910096E507 /* action.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = action.m; path = ../../../ui/cocoa/action.m; sourceTree = "<absolute>"; };
+		ED3EDBE12F96B2100096E507 /* action.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = action.h; path = ../../../ui/cocoa/action.h; sourceTree = "<absolute>"; };
+		ED3EDBF22F96B2F80096E507 /* action.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = action.h; path = ../../../ui/common/action.h; sourceTree = "<absolute>"; };
+		ED3EDBF32F96B2F80096E507 /* action.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = action.c; path = ../../../ui/common/action.c; sourceTree = "<absolute>"; };
+		ED52BFAE2D86FC5D00FD8BE5 /* text.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = text.h; path = ../../../ui/cocoa/text.h; sourceTree = "<absolute>"; };
+		ED52BFAF2D86FC5D00FD8BE5 /* text.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = text.m; path = ../../../ui/cocoa/text.m; sourceTree = "<absolute>"; };
 		ED6580AC2CFF122700F5402F /* toolkit.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = toolkit.app; sourceTree = BUILT_PRODUCTS_DIR; };
-		ED6580DA2CFF19F900F5402F /* condvar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = condvar.h; path = /Users/olaf/Projekte/toolkit/ui/common/condvar.h; sourceTree = "<absolute>"; };
-		ED6580DB2CFF19F900F5402F /* condvar.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = condvar.c; path = /Users/olaf/Projekte/toolkit/ui/common/condvar.c; sourceTree = "<absolute>"; };
-		ED6580DC2CFF19F900F5402F /* context.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = context.h; path = /Users/olaf/Projekte/toolkit/ui/common/context.h; sourceTree = "<absolute>"; };
-		ED6580DD2CFF19F900F5402F /* context.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = context.c; path = /Users/olaf/Projekte/toolkit/ui/common/context.c; sourceTree = "<absolute>"; };
-		ED6580DE2CFF19F900F5402F /* document.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = document.h; path = /Users/olaf/Projekte/toolkit/ui/common/document.h; sourceTree = "<absolute>"; };
-		ED6580DF2CFF19F900F5402F /* document.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = document.c; path = /Users/olaf/Projekte/toolkit/ui/common/document.c; sourceTree = "<absolute>"; };
-		ED6580E02CFF19F900F5402F /* menu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = menu.h; path = /Users/olaf/Projekte/toolkit/ui/common/menu.h; sourceTree = "<absolute>"; };
-		ED6580E12CFF19F900F5402F /* menu.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = menu.c; path = /Users/olaf/Projekte/toolkit/ui/common/menu.c; sourceTree = "<absolute>"; };
-		ED6580E22CFF19F900F5402F /* object.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = object.h; path = /Users/olaf/Projekte/toolkit/ui/common/object.h; sourceTree = "<absolute>"; };
-		ED6580E32CFF19F900F5402F /* object.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = object.c; path = /Users/olaf/Projekte/toolkit/ui/common/object.c; sourceTree = "<absolute>"; };
-		ED6580E42CFF19F900F5402F /* properties.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = properties.h; path = /Users/olaf/Projekte/toolkit/ui/common/properties.h; sourceTree = "<absolute>"; };
-		ED6580E52CFF19F900F5402F /* properties.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = properties.c; path = /Users/olaf/Projekte/toolkit/ui/common/properties.c; sourceTree = "<absolute>"; };
-		ED6580E62CFF19F900F5402F /* threadpool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = threadpool.h; path = /Users/olaf/Projekte/toolkit/ui/common/threadpool.h; sourceTree = "<absolute>"; };
-		ED6580E72CFF19F900F5402F /* threadpool.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = threadpool.c; path = /Users/olaf/Projekte/toolkit/ui/common/threadpool.c; sourceTree = "<absolute>"; };
-		ED6580E82CFF19F900F5402F /* toolbar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = toolbar.h; path = /Users/olaf/Projekte/toolkit/ui/common/toolbar.h; sourceTree = "<absolute>"; };
-		ED6580E92CFF19F900F5402F /* toolbar.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = toolbar.c; path = /Users/olaf/Projekte/toolkit/ui/common/toolbar.c; sourceTree = "<absolute>"; };
-		ED6580EA2CFF19F900F5402F /* types.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = types.h; path = /Users/olaf/Projekte/toolkit/ui/common/types.h; sourceTree = "<absolute>"; };
-		ED6580EB2CFF19F900F5402F /* types.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = types.c; path = /Users/olaf/Projekte/toolkit/ui/common/types.c; sourceTree = "<absolute>"; };
-		ED6580F92CFF1A3000F5402F /* allocator.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = allocator.c; path = /Users/olaf/Projekte/toolkit/ucx/allocator.c; sourceTree = "<absolute>"; };
-		ED6580FA2CFF1A3000F5402F /* array_list.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = array_list.c; path = /Users/olaf/Projekte/toolkit/ucx/array_list.c; sourceTree = "<absolute>"; };
-		ED6580FB2CFF1A3000F5402F /* buffer.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = buffer.c; path = /Users/olaf/Projekte/toolkit/ucx/buffer.c; sourceTree = "<absolute>"; };
-		ED6580FC2CFF1A3000F5402F /* compare.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = compare.c; path = /Users/olaf/Projekte/toolkit/ucx/compare.c; sourceTree = "<absolute>"; };
+		ED6580DA2CFF19F900F5402F /* condvar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = condvar.h; path = ../../../ui/common/condvar.h; sourceTree = "<absolute>"; };
+		ED6580DB2CFF19F900F5402F /* condvar.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = condvar.c; path = ../../../ui/common/condvar.c; sourceTree = "<absolute>"; };
+		ED6580DC2CFF19F900F5402F /* context.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = context.h; path = ../../../ui/common/context.h; sourceTree = "<absolute>"; };
+		ED6580DD2CFF19F900F5402F /* context.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = context.c; path = ../../../ui/common/context.c; sourceTree = "<absolute>"; };
+		ED6580DE2CFF19F900F5402F /* document.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = document.h; path = ../../../ui/common/document.h; sourceTree = "<absolute>"; };
+		ED6580DF2CFF19F900F5402F /* document.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = document.c; path = ../../../ui/common/document.c; sourceTree = "<absolute>"; };
+		ED6580E02CFF19F900F5402F /* menu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = menu.h; path = ../../../ui/common/menu.h; sourceTree = "<absolute>"; };
+		ED6580E12CFF19F900F5402F /* menu.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = menu.c; path = ../../../ui/common/menu.c; sourceTree = "<absolute>"; };
+		ED6580E22CFF19F900F5402F /* object.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = object.h; path = ../../../ui/common/object.h; sourceTree = "<absolute>"; };
+		ED6580E32CFF19F900F5402F /* object.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = object.c; path = ../../../ui/common/object.c; sourceTree = "<absolute>"; };
+		ED6580E42CFF19F900F5402F /* properties.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = properties.h; path = ../../../ui/common/properties.h; sourceTree = "<absolute>"; };
+		ED6580E52CFF19F900F5402F /* properties.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = properties.c; path = ../../../ui/common/properties.c; sourceTree = "<absolute>"; };
+		ED6580E62CFF19F900F5402F /* threadpool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = threadpool.h; path = ../../../ui/common/threadpool.h; sourceTree = "<absolute>"; };
+		ED6580E72CFF19F900F5402F /* threadpool.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = threadpool.c; path = ../../../ui/common/threadpool.c; sourceTree = "<absolute>"; };
+		ED6580E82CFF19F900F5402F /* toolbar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = toolbar.h; path = ../../../ui/common/toolbar.h; sourceTree = "<absolute>"; };
+		ED6580E92CFF19F900F5402F /* toolbar.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = toolbar.c; path = ../../../ui/common/toolbar.c; sourceTree = "<absolute>"; };
+		ED6580EA2CFF19F900F5402F /* types.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = types.h; path = ../../../ui/common/types.h; sourceTree = "<absolute>"; };
+		ED6580EB2CFF19F900F5402F /* types.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = types.c; path = ../../../ui/common/types.c; sourceTree = "<absolute>"; };
+		ED6580F92CFF1A3000F5402F /* allocator.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = allocator.c; path = ../../../ucx/allocator.c; sourceTree = "<absolute>"; };
+		ED6580FA2CFF1A3000F5402F /* array_list.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = array_list.c; path = ../../../ucx/array_list.c; sourceTree = "<absolute>"; };
+		ED6580FB2CFF1A3000F5402F /* buffer.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = buffer.c; path = ../../../ucx/buffer.c; sourceTree = "<absolute>"; };
+		ED6580FC2CFF1A3000F5402F /* compare.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = compare.c; path = ../../../ucx/compare.c; sourceTree = "<absolute>"; };
 		ED6580FD2CFF1A3000F5402F /* allocator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = allocator.h; sourceTree = "<group>"; };
 		ED6580FE2CFF1A3000F5402F /* array_list.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = array_list.h; sourceTree = "<group>"; };
 		ED6580FF2CFF1A3000F5402F /* buffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = "<group>"; };
@@ -112,95 +118,95 @@
 		ED65810C2CFF1A3000F5402F /* string.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = string.h; sourceTree = "<group>"; };
 		ED65810D2CFF1A3000F5402F /* test.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = test.h; sourceTree = "<group>"; };
 		ED65810E2CFF1A3000F5402F /* tree.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tree.h; sourceTree = "<group>"; };
-		ED6581112CFF1A3000F5402F /* hash_key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = hash_key.c; path = /Users/olaf/Projekte/toolkit/ucx/hash_key.c; sourceTree = "<absolute>"; };
-		ED6581122CFF1A3000F5402F /* hash_map.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = hash_map.c; path = /Users/olaf/Projekte/toolkit/ucx/hash_map.c; sourceTree = "<absolute>"; };
-		ED6581132CFF1A3000F5402F /* iterator.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = iterator.c; path = /Users/olaf/Projekte/toolkit/ucx/iterator.c; sourceTree = "<absolute>"; };
-		ED6581142CFF1A3000F5402F /* linked_list.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = linked_list.c; path = /Users/olaf/Projekte/toolkit/ucx/linked_list.c; sourceTree = "<absolute>"; };
-		ED6581152CFF1A3000F5402F /* list.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = list.c; path = /Users/olaf/Projekte/toolkit/ucx/list.c; sourceTree = "<absolute>"; };
-		ED6581162CFF1A3000F5402F /* map.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = map.c; path = /Users/olaf/Projekte/toolkit/ucx/map.c; sourceTree = "<absolute>"; };
-		ED6581172CFF1A3000F5402F /* mempool.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = mempool.c; path = /Users/olaf/Projekte/toolkit/ucx/mempool.c; sourceTree = "<absolute>"; };
-		ED6581182CFF1A3000F5402F /* printf.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = printf.c; path = /Users/olaf/Projekte/toolkit/ucx/printf.c; sourceTree = "<absolute>"; };
-		ED6581192CFF1A3000F5402F /* string.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = string.c; path = /Users/olaf/Projekte/toolkit/ucx/string.c; sourceTree = "<absolute>"; };
-		ED65811B2CFF1A3000F5402F /* tree.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = tree.c; path = /Users/olaf/Projekte/toolkit/ucx/tree.c; sourceTree = "<absolute>"; };
-		ED65812F2CFF1A8800F5402F /* toolkit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = toolkit.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/toolkit.h; sourceTree = "<absolute>"; };
-		ED6581302CFF1A8800F5402F /* toolkit.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = toolkit.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/toolkit.m; sourceTree = "<absolute>"; };
-		ED6581322CFF1F1900F5402F /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/AppDelegate.h; sourceTree = "<absolute>"; };
-		ED6581332CFF1F1900F5402F /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/AppDelegate.m; sourceTree = "<absolute>"; };
-		ED6581352CFF287300F5402F /* EventData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EventData.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/EventData.h; sourceTree = "<absolute>"; };
-		ED6581362CFF287300F5402F /* EventData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = EventData.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/EventData.m; sourceTree = "<absolute>"; };
-		ED65813B2CFF3BCE00F5402F /* button.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = button.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/button.h; sourceTree = "<absolute>"; };
-		ED65813C2CFF3BCE00F5402F /* button.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = button.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/button.m; sourceTree = "<absolute>"; };
-		ED65813D2CFF3BCE00F5402F /* container.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = container.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/container.h; sourceTree = "<absolute>"; };
-		ED65813E2CFF3BCE00F5402F /* container.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = container.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/container.m; sourceTree = "<absolute>"; };
-		ED65813F2CFF3BCE00F5402F /* GridLayout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GridLayout.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/GridLayout.h; sourceTree = "<absolute>"; };
-		ED6581402CFF3BCE00F5402F /* GridLayout.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = GridLayout.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/GridLayout.m; sourceTree = "<absolute>"; };
-		ED6581412CFF3BCE00F5402F /* window.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = window.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/window.h; sourceTree = "<absolute>"; };
-		ED6581422CFF3BCE00F5402F /* window.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = window.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/window.m; sourceTree = "<absolute>"; };
-		ED6581482CFF3CA000F5402F /* button.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = button.h; path = /Users/olaf/Projekte/toolkit/ui/ui/button.h; sourceTree = "<absolute>"; };
-		ED6581492CFF3CA000F5402F /* container.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = container.h; path = /Users/olaf/Projekte/toolkit/ui/ui/container.h; sourceTree = "<absolute>"; };
-		ED65814A2CFF3CA000F5402F /* display.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = display.h; path = /Users/olaf/Projekte/toolkit/ui/ui/display.h; sourceTree = "<absolute>"; };
-		ED65814B2CFF3CA000F5402F /* dnd.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = dnd.h; path = /Users/olaf/Projekte/toolkit/ui/ui/dnd.h; sourceTree = "<absolute>"; };
-		ED65814C2CFF3CA000F5402F /* entry.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = entry.h; path = /Users/olaf/Projekte/toolkit/ui/ui/entry.h; sourceTree = "<absolute>"; };
-		ED65814D2CFF3CA000F5402F /* graphics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = graphics.h; path = /Users/olaf/Projekte/toolkit/ui/ui/graphics.h; sourceTree = "<absolute>"; };
-		ED65814E2CFF3CA000F5402F /* icons.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = icons.h; path = /Users/olaf/Projekte/toolkit/ui/ui/icons.h; sourceTree = "<absolute>"; };
-		ED65814F2CFF3CA000F5402F /* image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = image.h; path = /Users/olaf/Projekte/toolkit/ui/ui/image.h; sourceTree = "<absolute>"; };
-		ED6581502CFF3CA000F5402F /* menu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = menu.h; path = /Users/olaf/Projekte/toolkit/ui/ui/menu.h; sourceTree = "<absolute>"; };
-		ED6581512CFF3CA000F5402F /* properties.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = properties.h; path = /Users/olaf/Projekte/toolkit/ui/ui/properties.h; sourceTree = "<absolute>"; };
-		ED6581522CFF3CA000F5402F /* range.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = range.h; path = /Users/olaf/Projekte/toolkit/ui/ui/range.h; sourceTree = "<absolute>"; };
-		ED6581542CFF3CA000F5402F /* text.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = text.h; path = /Users/olaf/Projekte/toolkit/ui/ui/text.h; sourceTree = "<absolute>"; };
-		ED6581552CFF3CA000F5402F /* toolbar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = toolbar.h; path = /Users/olaf/Projekte/toolkit/ui/ui/toolbar.h; sourceTree = "<absolute>"; };
-		ED6581562CFF3CA000F5402F /* toolkit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = toolkit.h; path = /Users/olaf/Projekte/toolkit/ui/ui/toolkit.h; sourceTree = "<absolute>"; };
-		ED6581582CFF3CA000F5402F /* ui.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ui.h; path = /Users/olaf/Projekte/toolkit/ui/ui/ui.h; sourceTree = "<absolute>"; };
-		ED6581592CFF3CA000F5402F /* window.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = window.h; path = /Users/olaf/Projekte/toolkit/ui/ui/window.h; sourceTree = "<absolute>"; };
-		ED65815A2CFF3EE900F5402F /* MainWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainWindow.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/MainWindow.h; sourceTree = "<absolute>"; };
-		ED65815B2CFF3EE900F5402F /* MainWindow.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MainWindow.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/MainWindow.m; sourceTree = "<absolute>"; };
-		ED65815D2CFF4BF200F5402F /* WindowManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WindowManager.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/WindowManager.h; sourceTree = "<absolute>"; };
-		ED65815E2CFF4BF200F5402F /* WindowManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = WindowManager.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/WindowManager.m; sourceTree = "<absolute>"; };
-		ED679B082E5B266C001D4F71 /* label.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = label.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/label.h; sourceTree = "<absolute>"; };
-		ED679B092E5B266C001D4F71 /* label.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = label.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/label.m; sourceTree = "<absolute>"; };
-		ED679B0B2E5B2FB0001D4F71 /* UiThread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = UiThread.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/UiThread.h; sourceTree = "<absolute>"; };
-		ED679B0C2E5B2FB0001D4F71 /* UiThread.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = UiThread.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/UiThread.m; sourceTree = "<absolute>"; };
-		ED67B5082EEDB82200DA8FD6 /* list.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = list.h; path = /Users/olaf/Projekte/toolkit/ui/ui/list.h; sourceTree = "<absolute>"; };
-		ED67B5092EEDB85A00DA8FD6 /* kv_list.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = kv_list.c; path = /Users/olaf/Projekte/toolkit/ucx/kv_list.c; sourceTree = "<absolute>"; };
+		ED6581112CFF1A3000F5402F /* hash_key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = hash_key.c; path = ../../../ucx/hash_key.c; sourceTree = "<absolute>"; };
+		ED6581122CFF1A3000F5402F /* hash_map.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = hash_map.c; path = ../../../ucx/hash_map.c; sourceTree = "<absolute>"; };
+		ED6581132CFF1A3000F5402F /* iterator.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = iterator.c; path = ../../../ucx/iterator.c; sourceTree = "<absolute>"; };
+		ED6581142CFF1A3000F5402F /* linked_list.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = linked_list.c; path = ../../../ucx/linked_list.c; sourceTree = "<absolute>"; };
+		ED6581152CFF1A3000F5402F /* list.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = list.c; path = ../../../ucx/list.c; sourceTree = "<absolute>"; };
+		ED6581162CFF1A3000F5402F /* map.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = map.c; path = ../../../ucx/map.c; sourceTree = "<absolute>"; };
+		ED6581172CFF1A3000F5402F /* mempool.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = mempool.c; path = ../../../ucx/mempool.c; sourceTree = "<absolute>"; };
+		ED6581182CFF1A3000F5402F /* printf.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = printf.c; path = ../../../ucx/printf.c; sourceTree = "<absolute>"; };
+		ED6581192CFF1A3000F5402F /* string.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = string.c; path = ../../../ucx/string.c; sourceTree = "<absolute>"; };
+		ED65811B2CFF1A3000F5402F /* tree.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = tree.c; path = ../../../ucx/tree.c; sourceTree = "<absolute>"; };
+		ED65812F2CFF1A8800F5402F /* toolkit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = toolkit.h; path = ../../../ui/cocoa/toolkit.h; sourceTree = "<absolute>"; };
+		ED6581302CFF1A8800F5402F /* toolkit.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = toolkit.m; path = ../../../ui/cocoa/toolkit.m; sourceTree = "<absolute>"; };
+		ED6581322CFF1F1900F5402F /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = ../../../ui/cocoa/AppDelegate.h; sourceTree = "<absolute>"; };
+		ED6581332CFF1F1900F5402F /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = ../../../ui/cocoa/AppDelegate.m; sourceTree = "<absolute>"; };
+		ED6581352CFF287300F5402F /* EventData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EventData.h; path = ../../../ui/cocoa/EventData.h; sourceTree = "<absolute>"; };
+		ED6581362CFF287300F5402F /* EventData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = EventData.m; path = ../../../ui/cocoa/EventData.m; sourceTree = "<absolute>"; };
+		ED65813B2CFF3BCE00F5402F /* button.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = button.h; path = ../../../ui/cocoa/button.h; sourceTree = "<absolute>"; };
+		ED65813C2CFF3BCE00F5402F /* button.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = button.m; path = ../../../ui/cocoa/button.m; sourceTree = "<absolute>"; };
+		ED65813D2CFF3BCE00F5402F /* container.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = container.h; path = ../../../ui/cocoa/container.h; sourceTree = "<absolute>"; };
+		ED65813E2CFF3BCE00F5402F /* container.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = container.m; path = ../../../ui/cocoa/container.m; sourceTree = "<absolute>"; };
+		ED65813F2CFF3BCE00F5402F /* GridLayout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GridLayout.h; path = ../../../ui/cocoa/GridLayout.h; sourceTree = "<absolute>"; };
+		ED6581402CFF3BCE00F5402F /* GridLayout.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = GridLayout.m; path = ../../../ui/cocoa/GridLayout.m; sourceTree = "<absolute>"; };
+		ED6581412CFF3BCE00F5402F /* window.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = window.h; path = ../../../ui/cocoa/window.h; sourceTree = "<absolute>"; };
+		ED6581422CFF3BCE00F5402F /* window.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = window.m; path = ../../../ui/cocoa/window.m; sourceTree = "<absolute>"; };
+		ED6581482CFF3CA000F5402F /* button.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = button.h; path = ../../../ui/ui/button.h; sourceTree = "<absolute>"; };
+		ED6581492CFF3CA000F5402F /* container.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = container.h; path = ../../../ui/ui/container.h; sourceTree = "<absolute>"; };
+		ED65814A2CFF3CA000F5402F /* display.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = display.h; path = ../../../ui/ui/display.h; sourceTree = "<absolute>"; };
+		ED65814B2CFF3CA000F5402F /* dnd.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = dnd.h; path = ../../../ui/ui/dnd.h; sourceTree = "<absolute>"; };
+		ED65814C2CFF3CA000F5402F /* entry.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = entry.h; path = ../../../ui/ui/entry.h; sourceTree = "<absolute>"; };
+		ED65814D2CFF3CA000F5402F /* graphics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = graphics.h; path = ../../../ui/ui/graphics.h; sourceTree = "<absolute>"; };
+		ED65814E2CFF3CA000F5402F /* icons.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = icons.h; path = ../../../ui/ui/icons.h; sourceTree = "<absolute>"; };
+		ED65814F2CFF3CA000F5402F /* image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = image.h; path = ../../../ui/ui/image.h; sourceTree = "<absolute>"; };
+		ED6581502CFF3CA000F5402F /* menu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = menu.h; path = ../../../ui/ui/menu.h; sourceTree = "<absolute>"; };
+		ED6581512CFF3CA000F5402F /* properties.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = properties.h; path = ../../../ui/ui/properties.h; sourceTree = "<absolute>"; };
+		ED6581522CFF3CA000F5402F /* range.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = range.h; path = ../../../ui/ui/range.h; sourceTree = "<absolute>"; };
+		ED6581542CFF3CA000F5402F /* text.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = text.h; path = ../../../ui/ui/text.h; sourceTree = "<absolute>"; };
+		ED6581552CFF3CA000F5402F /* toolbar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = toolbar.h; path = ../../../ui/ui/toolbar.h; sourceTree = "<absolute>"; };
+		ED6581562CFF3CA000F5402F /* toolkit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = toolkit.h; path = ../../../ui/ui/toolkit.h; sourceTree = "<absolute>"; };
+		ED6581582CFF3CA000F5402F /* ui.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ui.h; path = ../../../ui/ui/ui.h; sourceTree = "<absolute>"; };
+		ED6581592CFF3CA000F5402F /* window.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = window.h; path = ../../../ui/ui/window.h; sourceTree = "<absolute>"; };
+		ED65815A2CFF3EE900F5402F /* MainWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainWindow.h; path = ../../../ui/cocoa/MainWindow.h; sourceTree = "<absolute>"; };
+		ED65815B2CFF3EE900F5402F /* MainWindow.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MainWindow.m; path = ../../../ui/cocoa/MainWindow.m; sourceTree = "<absolute>"; };
+		ED65815D2CFF4BF200F5402F /* WindowManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WindowManager.h; path = ../../../ui/cocoa/WindowManager.h; sourceTree = "<absolute>"; };
+		ED65815E2CFF4BF200F5402F /* WindowManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = WindowManager.m; path = ../../../ui/cocoa/WindowManager.m; sourceTree = "<absolute>"; };
+		ED679B082E5B266C001D4F71 /* label.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = label.h; path = ../../../ui/cocoa/label.h; sourceTree = "<absolute>"; };
+		ED679B092E5B266C001D4F71 /* label.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = label.m; path = ../../../ui/cocoa/label.m; sourceTree = "<absolute>"; };
+		ED679B0B2E5B2FB0001D4F71 /* UiThread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = UiThread.h; path = ../../../ui/cocoa/UiThread.h; sourceTree = "<absolute>"; };
+		ED679B0C2E5B2FB0001D4F71 /* UiThread.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = UiThread.m; path = ../../../ui/cocoa/UiThread.m; sourceTree = "<absolute>"; };
+		ED67B5082EEDB82200DA8FD6 /* list.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = list.h; path = ../../../ui/ui/list.h; sourceTree = "<absolute>"; };
+		ED67B5092EEDB85A00DA8FD6 /* kv_list.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = kv_list.c; path = ../../../ucx/kv_list.c; sourceTree = "<absolute>"; };
 		ED67B50B2EEDB86D00DA8FD6 /* kv_list.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = kv_list.h; sourceTree = "<group>"; };
-		ED67B50C2EEDB89300DA8FD6 /* app.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = app.h; path = /Users/olaf/Projekte/toolkit/ui/common/app.h; sourceTree = "<absolute>"; };
-		ED67B50D2EEDB89300DA8FD6 /* app.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = app.c; path = /Users/olaf/Projekte/toolkit/ui/common/app.c; sourceTree = "<absolute>"; };
-		ED67B50E2EEDB89300DA8FD6 /* message.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = message.h; path = /Users/olaf/Projekte/toolkit/ui/common/message.h; sourceTree = "<absolute>"; };
-		ED67B50F2EEDB89300DA8FD6 /* message.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = message.c; path = /Users/olaf/Projekte/toolkit/ui/common/message.c; sourceTree = "<absolute>"; };
-		ED67B5102EEDB89300DA8FD6 /* utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = utils.h; path = /Users/olaf/Projekte/toolkit/ui/common/utils.h; sourceTree = "<absolute>"; };
-		ED67B5112EEDB89300DA8FD6 /* utils.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = utils.c; path = /Users/olaf/Projekte/toolkit/ui/common/utils.c; sourceTree = "<absolute>"; };
-		ED6FB0372E95466F006C6E8E /* args.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = args.h; path = /Users/olaf/Projekte/toolkit/ui/common/args.h; sourceTree = "<absolute>"; };
-		ED6FB0382E95466F006C6E8E /* args.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = args.c; path = /Users/olaf/Projekte/toolkit/ui/common/args.c; sourceTree = "<absolute>"; };
-		ED6FB0392E95466F006C6E8E /* container.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = container.h; path = /Users/olaf/Projekte/toolkit/ui/common/container.h; sourceTree = "<absolute>"; };
-		ED6FB03A2E95466F006C6E8E /* container.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = container.c; path = /Users/olaf/Projekte/toolkit/ui/common/container.c; sourceTree = "<absolute>"; };
-		ED6FB03B2E95466F006C6E8E /* wrapper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = wrapper.h; path = /Users/olaf/Projekte/toolkit/ui/common/wrapper.h; sourceTree = "<absolute>"; };
-		ED6FB03C2E95466F006C6E8E /* wrapper.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = wrapper.c; path = /Users/olaf/Projekte/toolkit/ui/common/wrapper.c; sourceTree = "<absolute>"; };
-		ED83C2BD2E8EA49200054B22 /* BoxContainer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BoxContainer.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/BoxContainer.h; sourceTree = "<absolute>"; };
-		ED83C2BE2E8EA49200054B22 /* BoxContainer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = BoxContainer.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/BoxContainer.m; sourceTree = "<absolute>"; };
+		ED67B50C2EEDB89300DA8FD6 /* app.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = app.h; path = ../../../ui/common/app.h; sourceTree = "<absolute>"; };
+		ED67B50D2EEDB89300DA8FD6 /* app.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = app.c; path = ../../../ui/common/app.c; sourceTree = "<absolute>"; };
+		ED67B50E2EEDB89300DA8FD6 /* message.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = message.h; path = ../../../ui/common/message.h; sourceTree = "<absolute>"; };
+		ED67B50F2EEDB89300DA8FD6 /* message.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = message.c; path = ../../../ui/common/message.c; sourceTree = "<absolute>"; };
+		ED67B5102EEDB89300DA8FD6 /* utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../ui/common/utils.h; sourceTree = "<absolute>"; };
+		ED67B5112EEDB89300DA8FD6 /* utils.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = utils.c; path = ../../../ui/common/utils.c; sourceTree = "<absolute>"; };
+		ED6FB0372E95466F006C6E8E /* args.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = args.h; path = ../../../ui/common/args.h; sourceTree = "<absolute>"; };
+		ED6FB0382E95466F006C6E8E /* args.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = args.c; path = ../../../ui/common/args.c; sourceTree = "<absolute>"; };
+		ED6FB0392E95466F006C6E8E /* container.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = container.h; path = ../../../ui/common/container.h; sourceTree = "<absolute>"; };
+		ED6FB03A2E95466F006C6E8E /* container.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = container.c; path = ../../../ui/common/container.c; sourceTree = "<absolute>"; };
+		ED6FB03B2E95466F006C6E8E /* wrapper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = wrapper.h; path = ../../../ui/common/wrapper.h; sourceTree = "<absolute>"; };
+		ED6FB03C2E95466F006C6E8E /* wrapper.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = wrapper.c; path = ../../../ui/common/wrapper.c; sourceTree = "<absolute>"; };
+		ED83C2BD2E8EA49200054B22 /* BoxContainer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BoxContainer.h; path = ../../../ui/cocoa/BoxContainer.h; sourceTree = "<absolute>"; };
+		ED83C2BE2E8EA49200054B22 /* BoxContainer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = BoxContainer.m; path = ../../../ui/cocoa/BoxContainer.m; sourceTree = "<absolute>"; };
 		ED8687E32D999CF3002F3EC2 /* menu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = menu.h; path = ../../../ui/cocoa/menu.h; sourceTree = SOURCE_ROOT; };
 		ED8687E42D999CF3002F3EC2 /* menu.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = menu.m; path = ../../../ui/cocoa/menu.m; sourceTree = SOURCE_ROOT; };
-		ED895DA82EA0CACC00040078 /* TabView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TabView.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/TabView.h; sourceTree = "<absolute>"; };
-		ED895DA92EA0CACC00040078 /* TabView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TabView.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/TabView.m; sourceTree = "<absolute>"; };
-		ED99F0482E5CBD2E00A4CC97 /* widget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = widget.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/widget.h; sourceTree = "<absolute>"; };
-		ED99F0492E5CBD2E00A4CC97 /* widget.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = widget.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/widget.m; sourceTree = "<absolute>"; };
-		ED99F04B2E5CBE5000A4CC97 /* webview.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = webview.h; path = /Users/olaf/Projekte/toolkit/ui/ui/webview.h; sourceTree = "<absolute>"; };
-		ED99F04C2E5CBE5000A4CC97 /* widget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = widget.h; path = /Users/olaf/Projekte/toolkit/ui/ui/widget.h; sourceTree = "<absolute>"; };
-		EDB452C12E302C65006FB12D /* image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = image.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/image.h; sourceTree = "<absolute>"; };
-		EDB452C22E302C65006FB12D /* image.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = image.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/image.m; sourceTree = "<absolute>"; };
-		EDBC4D252EAD4BB0005CDF38 /* webview.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = webview.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/webview.h; sourceTree = "<absolute>"; };
-		EDBC4D262EAD4BB0005CDF38 /* webview.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = webview.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/webview.m; sourceTree = "<absolute>"; };
-		EDC315A32E9A736900403776 /* json.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = json.h; path = /Users/olaf/Projekte/toolkit/ucx/cx/json.h; sourceTree = "<absolute>"; };
-		EDC315A42E9A736900403776 /* properties.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = properties.h; path = /Users/olaf/Projekte/toolkit/ucx/cx/properties.h; sourceTree = "<absolute>"; };
-		EDC315A52E9A736900403776 /* streams.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = streams.h; path = /Users/olaf/Projekte/toolkit/ucx/cx/streams.h; sourceTree = "<absolute>"; };
-		EDC315A62E9A739300403776 /* json.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = json.c; path = /Users/olaf/Projekte/toolkit/ucx/json.c; sourceTree = "<absolute>"; };
-		EDC315A72E9A739300403776 /* properties.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = properties.c; path = /Users/olaf/Projekte/toolkit/ucx/properties.c; sourceTree = "<absolute>"; };
-		EDC315A82E9A739300403776 /* streams.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = streams.c; path = /Users/olaf/Projekte/toolkit/ucx/streams.c; sourceTree = "<absolute>"; };
-		EDCD22252E59EEF5000612AF /* list.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = list.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/list.h; sourceTree = "<absolute>"; };
-		EDCD22262E59EEF5000612AF /* list.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = list.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/list.m; sourceTree = "<absolute>"; };
-		EDCD22332E59F3B1000612AF /* ListDataSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ListDataSource.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/ListDataSource.h; sourceTree = "<absolute>"; };
-		EDCD22342E59F3B1000612AF /* ListDataSource.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ListDataSource.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/ListDataSource.m; sourceTree = "<absolute>"; };
-		EDCD22362E5A160A000612AF /* ListDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ListDelegate.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/ListDelegate.h; sourceTree = "<absolute>"; };
-		EDCD22372E5A160A000612AF /* ListDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ListDelegate.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/ListDelegate.m; sourceTree = "<absolute>"; };
+		ED895DA82EA0CACC00040078 /* TabView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TabView.h; path = ../../../ui/cocoa/TabView.h; sourceTree = "<absolute>"; };
+		ED895DA92EA0CACC00040078 /* TabView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TabView.m; path = ../../../ui/cocoa/TabView.m; sourceTree = "<absolute>"; };
+		ED99F0482E5CBD2E00A4CC97 /* widget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = widget.h; path = ../../../ui/cocoa/widget.h; sourceTree = "<absolute>"; };
+		ED99F0492E5CBD2E00A4CC97 /* widget.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = widget.m; path = ../../../ui/cocoa/widget.m; sourceTree = "<absolute>"; };
+		ED99F04B2E5CBE5000A4CC97 /* webview.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = webview.h; path = ../../../ui/ui/webview.h; sourceTree = "<absolute>"; };
+		ED99F04C2E5CBE5000A4CC97 /* widget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = widget.h; path = ../../../ui/ui/widget.h; sourceTree = "<absolute>"; };
+		EDB452C12E302C65006FB12D /* image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = image.h; path = ../../../ui/cocoa/image.h; sourceTree = "<absolute>"; };
+		EDB452C22E302C65006FB12D /* image.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = image.m; path = ../../../ui/cocoa/image.m; sourceTree = "<absolute>"; };
+		EDBC4D252EAD4BB0005CDF38 /* webview.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = webview.h; path = ../../../ui/cocoa/webview.h; sourceTree = "<absolute>"; };
+		EDBC4D262EAD4BB0005CDF38 /* webview.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = webview.m; path = ../../../ui/cocoa/webview.m; sourceTree = "<absolute>"; };
+		EDC315A32E9A736900403776 /* json.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = json.h; path = ../../../ucx/cx/json.h; sourceTree = "<absolute>"; };
+		EDC315A42E9A736900403776 /* properties.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = properties.h; path = ../../../ucx/cx/properties.h; sourceTree = "<absolute>"; };
+		EDC315A52E9A736900403776 /* streams.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = streams.h; path = ../../../ucx/cx/streams.h; sourceTree = "<absolute>"; };
+		EDC315A62E9A739300403776 /* json.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = json.c; path = ../../../ucx/json.c; sourceTree = "<absolute>"; };
+		EDC315A72E9A739300403776 /* properties.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = properties.c; path = ../../../ucx/properties.c; sourceTree = "<absolute>"; };
+		EDC315A82E9A739300403776 /* streams.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = streams.c; path = ../../../ucx/streams.c; sourceTree = "<absolute>"; };
+		EDCD22252E59EEF5000612AF /* list.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = list.h; path = ../../../ui/cocoa/list.h; sourceTree = "<absolute>"; };
+		EDCD22262E59EEF5000612AF /* list.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = list.m; path = ../../../ui/cocoa/list.m; sourceTree = "<absolute>"; };
+		EDCD22332E59F3B1000612AF /* ListDataSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ListDataSource.h; path = ../../../ui/cocoa/ListDataSource.h; sourceTree = "<absolute>"; };
+		EDCD22342E59F3B1000612AF /* ListDataSource.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ListDataSource.m; path = ../../../ui/cocoa/ListDataSource.m; sourceTree = "<absolute>"; };
+		EDCD22362E5A160A000612AF /* ListDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ListDelegate.h; path = ../../../ui/cocoa/ListDelegate.h; sourceTree = "<absolute>"; };
+		EDCD22372E5A160A000612AF /* ListDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ListDelegate.m; path = ../../../ui/cocoa/ListDelegate.m; sourceTree = "<absolute>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFileSystemSynchronizedRootGroup section */
@@ -245,6 +251,8 @@
 		ED6580D92CFF19DB00F5402F /* common */ = {
 			isa = PBXGroup;
 			children = (
+				ED3EDBF22F96B2F80096E507 /* action.h */,
+				ED3EDBF32F96B2F80096E507 /* action.c */,
 				ED67B50C2EEDB89300DA8FD6 /* app.h */,
 				ED67B50D2EEDB89300DA8FD6 /* app.c */,
 				ED67B50E2EEDB89300DA8FD6 /* message.h */,
@@ -331,12 +339,14 @@
 				EDC315A52E9A736900403776 /* streams.h */,
 			);
 			name = cx;
-			path = /Users/olaf/Projekte/toolkit/ucx/cx;
+			path = ../../../ucx/cx;
 			sourceTree = "<absolute>";
 		};
 		ED65812E2CFF1A7200F5402F /* cocoa */ = {
 			isa = PBXGroup;
 			children = (
+				ED3EDBE12F96B2100096E507 /* action.h */,
+				ED3EDBD72F96B1910096E507 /* action.m */,
 				EDBC4D252EAD4BB0005CDF38 /* webview.h */,
 				EDBC4D262EAD4BB0005CDF38 /* webview.m */,
 				ED895DA82EA0CACC00040078 /* TabView.h */,
@@ -500,11 +510,13 @@
 				ED65815F2CFF4BF200F5402F /* WindowManager.m in Sources */,
 				ED6580F22CFF19F900F5402F /* document.c in Sources */,
 				ED65811D2CFF1A3000F5402F /* linked_list.c in Sources */,
+				ED3EDBF42F96B2F80096E507 /* action.c in Sources */,
 				ED67B5122EEDB89300DA8FD6 /* utils.c in Sources */,
 				ED67B5132EEDB89300DA8FD6 /* app.c in Sources */,
 				ED67B5142EEDB89300DA8FD6 /* message.c in Sources */,
 				ED2F55AE2E34FAD800A84793 /* Toolbar.m in Sources */,
 				ED65811E2CFF1A3000F5402F /* tree.c in Sources */,
+				ED3EDBD82F96B1910096E507 /* action.m in Sources */,
 				ED6581202CFF1A3000F5402F /* mempool.c in Sources */,
 				EDC315A92E9A739300403776 /* json.c in Sources */,
 				EDC315AA2E9A739300403776 /* properties.c in Sources */,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ui/cocoa/action.h	Mon Apr 20 21:19:13 2026 +0200
@@ -0,0 +1,30 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2026 Olaf Wintermann. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../ui/toolkit.h"
+#include "../common/action.h"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ui/cocoa/action.m	Mon Apr 20 21:19:13 2026 +0200
@@ -0,0 +1,53 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2026 Olaf Wintermann. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "action.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+
+
+/* ------------------------------ public API ------------------------------ */
+
+void ui_add_action(UiContext *ctx, const char *name, ui_callback callback, void *userdata) {
+    uic_add_action(ctx, name, callback, userdata, NULL, NULL);
+}
+
+void ui_add_action_with_accelerator(
+        UiContext *ctx,
+        const char *name,
+        ui_callback callback,
+        void *userdata,
+        const char *accelerator,
+        const char *accelerator_text)
+{
+    uic_add_action(ctx, name, callback, userdata, accelerator, accelerator_text);
+    
+    // TODO: accelerator
+}
--- a/ui/cocoa/objs.mk	Sun Apr 19 20:05:11 2026 +0200
+++ b/ui/cocoa/objs.mk	Mon Apr 20 21:19:13 2026 +0200
@@ -51,6 +51,7 @@
 COCOAOBJ += image.o
 COCOAOBJ += entry.o
 COCOAOBJ += TabView.o
+COCOAOBJ += action.o
 
 TOOLKITOBJS += $(COCOAOBJ:%=$(COCOA_OBJPRE)%)
 TOOLKITSOURCE += $(COCOAOBJ:%.o=cocoa/%.m)

mercurial