@fairyhunter13/opentui-core 0.1.90 → 0.1.92

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/3d/SpriteResourceManager.d.ts +74 -0
  2. package/3d/SpriteUtils.d.ts +13 -0
  3. package/3d/TextureUtils.d.ts +24 -0
  4. package/3d/ThreeRenderable.d.ts +40 -0
  5. package/3d/WGPURenderer.d.ts +61 -0
  6. package/3d/animation/ExplodingSpriteEffect.d.ts +71 -0
  7. package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +76 -0
  8. package/3d/animation/SpriteAnimator.d.ts +124 -0
  9. package/3d/animation/SpriteParticleGenerator.d.ts +62 -0
  10. package/3d/canvas.d.ts +44 -0
  11. package/3d/index.d.ts +12 -0
  12. package/3d/physics/PlanckPhysicsAdapter.d.ts +19 -0
  13. package/3d/physics/RapierPhysicsAdapter.d.ts +19 -0
  14. package/3d/physics/physics-interface.d.ts +27 -0
  15. package/3d.d.ts +2 -0
  16. package/3d.js +34042 -0
  17. package/3d.js.map +155 -0
  18. package/LICENSE +21 -0
  19. package/NativeSpanFeed.d.ts +41 -0
  20. package/README.md +2 -2
  21. package/Renderable.d.ts +334 -0
  22. package/animation/Timeline.d.ts +126 -0
  23. package/ansi.d.ts +13 -0
  24. package/buffer.d.ts +107 -0
  25. package/console.d.ts +143 -0
  26. package/edit-buffer.d.ts +98 -0
  27. package/editor-view.d.ts +73 -0
  28. package/index-e6ec7apq.js +18415 -0
  29. package/index-e6ec7apq.js.map +64 -0
  30. package/index-h066zmrb.js +12619 -0
  31. package/index-h066zmrb.js.map +43 -0
  32. package/index-ynzawt3n.js +113 -0
  33. package/index-ynzawt3n.js.map +10 -0
  34. package/index.d.ts +21 -0
  35. package/index.js +430 -0
  36. package/index.js.map +9 -0
  37. package/lib/KeyHandler.d.ts +61 -0
  38. package/lib/RGBA.d.ts +25 -0
  39. package/lib/ascii.font.d.ts +508 -0
  40. package/lib/border.d.ts +49 -0
  41. package/lib/bunfs.d.ts +7 -0
  42. package/lib/clipboard.d.ts +17 -0
  43. package/lib/clock.d.ts +15 -0
  44. package/lib/data-paths.d.ts +26 -0
  45. package/lib/debounce.d.ts +42 -0
  46. package/lib/detect-links.d.ts +6 -0
  47. package/lib/env.d.ts +42 -0
  48. package/lib/extmarks-history.d.ts +17 -0
  49. package/lib/extmarks.d.ts +89 -0
  50. package/lib/hast-styled-text.d.ts +17 -0
  51. package/lib/index.d.ts +21 -0
  52. package/lib/keymapping.d.ts +25 -0
  53. package/lib/objects-in-viewport.d.ts +24 -0
  54. package/lib/output.capture.d.ts +24 -0
  55. package/lib/parse.keypress-kitty.d.ts +2 -0
  56. package/lib/parse.keypress.d.ts +26 -0
  57. package/lib/parse.mouse.d.ts +30 -0
  58. package/lib/paste.d.ts +7 -0
  59. package/lib/queue.d.ts +15 -0
  60. package/lib/renderable.validations.d.ts +12 -0
  61. package/lib/scroll-acceleration.d.ts +43 -0
  62. package/lib/selection.d.ts +63 -0
  63. package/lib/singleton.d.ts +7 -0
  64. package/lib/stdin-parser.d.ts +76 -0
  65. package/lib/styled-text.d.ts +63 -0
  66. package/lib/terminal-capability-detection.d.ts +30 -0
  67. package/lib/terminal-palette.d.ts +50 -0
  68. package/lib/tree-sitter/assets/update.d.ts +11 -0
  69. package/lib/tree-sitter/client.d.ts +47 -0
  70. package/lib/tree-sitter/default-parsers.d.ts +2 -0
  71. package/lib/tree-sitter/download-utils.d.ts +21 -0
  72. package/lib/tree-sitter/index.d.ts +8 -0
  73. package/lib/tree-sitter/parser.worker.d.ts +1 -0
  74. package/lib/tree-sitter/parsers-config.d.ts +38 -0
  75. package/lib/tree-sitter/resolve-ft.d.ts +2 -0
  76. package/lib/tree-sitter/types.d.ts +81 -0
  77. package/lib/tree-sitter-styled-text.d.ts +14 -0
  78. package/lib/validate-dir-name.d.ts +1 -0
  79. package/lib/yoga.options.d.ts +32 -0
  80. package/package.json +51 -63
  81. package/parser.worker.js +869 -0
  82. package/parser.worker.js.map +12 -0
  83. package/plugins/core-slot.d.ts +72 -0
  84. package/plugins/registry.d.ts +38 -0
  85. package/plugins/types.d.ts +34 -0
  86. package/post/filters.d.ts +105 -0
  87. package/renderables/ASCIIFont.d.ts +52 -0
  88. package/renderables/Box.d.ts +72 -0
  89. package/renderables/Code.d.ts +78 -0
  90. package/renderables/Diff.d.ts +142 -0
  91. package/renderables/EditBufferRenderable.d.ts +162 -0
  92. package/renderables/FrameBuffer.d.ts +16 -0
  93. package/renderables/Input.d.ts +67 -0
  94. package/renderables/LineNumberRenderable.d.ts +74 -0
  95. package/renderables/Markdown.d.ts +173 -0
  96. package/renderables/ScrollBar.d.ts +77 -0
  97. package/renderables/ScrollBox.d.ts +124 -0
  98. package/renderables/Select.d.ts +115 -0
  99. package/renderables/Slider.d.ts +44 -0
  100. package/renderables/TabSelect.d.ts +96 -0
  101. package/renderables/Text.d.ts +36 -0
  102. package/renderables/TextBufferRenderable.d.ts +105 -0
  103. package/renderables/TextNode.d.ts +91 -0
  104. package/renderables/TextTable.d.ts +140 -0
  105. package/renderables/Textarea.d.ts +114 -0
  106. package/renderables/TimeToFirstDraw.d.ts +24 -0
  107. package/renderables/__tests__/renderable-test-utils.d.ts +12 -0
  108. package/renderables/composition/VRenderable.d.ts +16 -0
  109. package/renderables/composition/constructs.d.ts +35 -0
  110. package/renderables/composition/vnode.d.ts +46 -0
  111. package/renderables/index.d.ts +22 -0
  112. package/renderables/markdown-parser.d.ts +10 -0
  113. package/renderer.d.ts +388 -0
  114. package/runtime-plugin-support.d.ts +3 -0
  115. package/runtime-plugin-support.js +29 -0
  116. package/runtime-plugin-support.js.map +10 -0
  117. package/runtime-plugin.d.ts +11 -0
  118. package/runtime-plugin.js +16 -0
  119. package/runtime-plugin.js.map +9 -0
  120. package/syntax-style.d.ts +54 -0
  121. package/testing/manual-clock.d.ts +16 -0
  122. package/testing/mock-keys.d.ts +81 -0
  123. package/testing/mock-mouse.d.ts +38 -0
  124. package/testing/mock-tree-sitter-client.d.ts +23 -0
  125. package/testing/spy.d.ts +7 -0
  126. package/testing/test-recorder.d.ts +61 -0
  127. package/testing/test-renderer.d.ts +23 -0
  128. package/testing.d.ts +6 -0
  129. package/testing.js +675 -0
  130. package/testing.js.map +15 -0
  131. package/text-buffer-view.d.ts +42 -0
  132. package/text-buffer.d.ts +67 -0
  133. package/types.d.ts +131 -0
  134. package/utils.d.ts +14 -0
  135. package/zig-structs.d.ts +155 -0
  136. package/zig.d.ts +351 -0
  137. package/dev/keypress-debug-renderer.ts +0 -148
  138. package/dev/keypress-debug.ts +0 -43
  139. package/dev/print-env-vars.ts +0 -32
  140. package/dev/test-tmux-graphics-334.sh +0 -68
  141. package/dev/thai-debug-test.ts +0 -68
  142. package/docs/development.md +0 -141
  143. package/docs/env-vars.md +0 -140
  144. package/docs/getting-started.md +0 -353
  145. package/docs/renderables-vs-constructs.md +0 -159
  146. package/docs/tree-sitter.md +0 -311
  147. package/scripts/build.ts +0 -400
  148. package/scripts/publish.ts +0 -60
  149. package/src/3d/SpriteResourceManager.ts +0 -286
  150. package/src/3d/SpriteUtils.ts +0 -71
  151. package/src/3d/TextureUtils.ts +0 -196
  152. package/src/3d/ThreeRenderable.ts +0 -197
  153. package/src/3d/WGPURenderer.ts +0 -294
  154. package/src/3d/animation/ExplodingSpriteEffect.ts +0 -513
  155. package/src/3d/animation/PhysicsExplodingSpriteEffect.ts +0 -429
  156. package/src/3d/animation/SpriteAnimator.ts +0 -633
  157. package/src/3d/animation/SpriteParticleGenerator.ts +0 -435
  158. package/src/3d/canvas.ts +0 -464
  159. package/src/3d/index.ts +0 -12
  160. package/src/3d/physics/PlanckPhysicsAdapter.ts +0 -72
  161. package/src/3d/physics/RapierPhysicsAdapter.ts +0 -66
  162. package/src/3d/physics/physics-interface.ts +0 -31
  163. package/src/3d/shaders/supersampling.wgsl +0 -201
  164. package/src/3d.ts +0 -3
  165. package/src/NativeSpanFeed.ts +0 -300
  166. package/src/Renderable.ts +0 -1698
  167. package/src/__snapshots__/buffer.test.ts.snap +0 -28
  168. package/src/animation/Timeline.test.ts +0 -2709
  169. package/src/animation/Timeline.ts +0 -598
  170. package/src/ansi.ts +0 -18
  171. package/src/benchmark/latest-all-bench-run.json +0 -707
  172. package/src/benchmark/latest-async-bench-run.json +0 -336
  173. package/src/benchmark/latest-default-bench-run.json +0 -657
  174. package/src/benchmark/latest-large-bench-run.json +0 -707
  175. package/src/benchmark/latest-quick-bench-run.json +0 -207
  176. package/src/benchmark/markdown-benchmark.ts +0 -1804
  177. package/src/benchmark/native-span-feed-async-benchmark.ts +0 -355
  178. package/src/benchmark/native-span-feed-benchmark.md +0 -56
  179. package/src/benchmark/native-span-feed-benchmark.ts +0 -596
  180. package/src/benchmark/native-span-feed-compare.ts +0 -280
  181. package/src/benchmark/renderer-benchmark.ts +0 -754
  182. package/src/benchmark/text-table-benchmark.ts +0 -947
  183. package/src/buffer.test.ts +0 -291
  184. package/src/buffer.ts +0 -519
  185. package/src/console.test.ts +0 -612
  186. package/src/console.ts +0 -1255
  187. package/src/edit-buffer.test.ts +0 -1769
  188. package/src/edit-buffer.ts +0 -411
  189. package/src/editor-view.test.ts +0 -1032
  190. package/src/editor-view.ts +0 -284
  191. package/src/examples/ascii-font-selection-demo.ts +0 -245
  192. package/src/examples/assets/Water_2_M_Normal.jpg +0 -0
  193. package/src/examples/assets/concrete.png +0 -0
  194. package/src/examples/assets/crate.png +0 -0
  195. package/src/examples/assets/crate_emissive.png +0 -0
  196. package/src/examples/assets/forrest_background.png +0 -0
  197. package/src/examples/assets/hast-example.json +0 -1018
  198. package/src/examples/assets/heart.png +0 -0
  199. package/src/examples/assets/main_char_heavy_attack.png +0 -0
  200. package/src/examples/assets/main_char_idle.png +0 -0
  201. package/src/examples/assets/main_char_jump_end.png +0 -0
  202. package/src/examples/assets/main_char_jump_landing.png +0 -0
  203. package/src/examples/assets/main_char_jump_start.png +0 -0
  204. package/src/examples/assets/main_char_run_loop.png +0 -0
  205. package/src/examples/assets/roughness_map.jpg +0 -0
  206. package/src/examples/build.ts +0 -115
  207. package/src/examples/code-demo.ts +0 -584
  208. package/src/examples/console-demo.ts +0 -358
  209. package/src/examples/core-plugin-slots-demo.ts +0 -759
  210. package/src/examples/diff-demo.ts +0 -699
  211. package/src/examples/draggable-three-demo.ts +0 -259
  212. package/src/examples/editor-demo.ts +0 -322
  213. package/src/examples/extmarks-demo.ts +0 -204
  214. package/src/examples/focus-restore-demo.ts +0 -310
  215. package/src/examples/fonts.ts +0 -245
  216. package/src/examples/fractal-shader-demo.ts +0 -268
  217. package/src/examples/framebuffer-demo.ts +0 -674
  218. package/src/examples/full-unicode-demo.ts +0 -181
  219. package/src/examples/golden-star-demo.ts +0 -933
  220. package/src/examples/grayscale-buffer-demo.ts +0 -249
  221. package/src/examples/hast-syntax-highlighting-demo.ts +0 -129
  222. package/src/examples/index.ts +0 -925
  223. package/src/examples/input-demo.ts +0 -377
  224. package/src/examples/input-select-layout-demo.ts +0 -425
  225. package/src/examples/install.sh +0 -143
  226. package/src/examples/keypress-debug-demo.ts +0 -452
  227. package/src/examples/lib/HexList.ts +0 -122
  228. package/src/examples/lib/PaletteGrid.ts +0 -125
  229. package/src/examples/lib/standalone-keys.ts +0 -25
  230. package/src/examples/lib/tab-controller.ts +0 -243
  231. package/src/examples/lights-phong-demo.ts +0 -290
  232. package/src/examples/link-demo.ts +0 -220
  233. package/src/examples/live-state-demo.ts +0 -480
  234. package/src/examples/markdown-demo.ts +0 -620
  235. package/src/examples/mouse-interaction-demo.ts +0 -428
  236. package/src/examples/nested-zindex-demo.ts +0 -357
  237. package/src/examples/opacity-example.ts +0 -235
  238. package/src/examples/opentui-demo.ts +0 -1057
  239. package/src/examples/physx-planck-2d-demo.ts +0 -507
  240. package/src/examples/physx-rapier-2d-demo.ts +0 -526
  241. package/src/examples/relative-positioning-demo.ts +0 -323
  242. package/src/examples/scroll-example.ts +0 -214
  243. package/src/examples/scrollbox-mouse-test.ts +0 -112
  244. package/src/examples/scrollbox-overlay-hit-test.ts +0 -206
  245. package/src/examples/select-demo.ts +0 -237
  246. package/src/examples/shader-cube-demo.ts +0 -772
  247. package/src/examples/simple-layout-example.ts +0 -591
  248. package/src/examples/slider-demo.ts +0 -617
  249. package/src/examples/split-mode-demo.ts +0 -445
  250. package/src/examples/sprite-animation-demo.ts +0 -443
  251. package/src/examples/sprite-particle-generator-demo.ts +0 -486
  252. package/src/examples/static-sprite-demo.ts +0 -193
  253. package/src/examples/sticky-scroll-example.ts +0 -308
  254. package/src/examples/styled-text-demo.ts +0 -282
  255. package/src/examples/tab-select-demo.ts +0 -219
  256. package/src/examples/terminal-title.ts +0 -29
  257. package/src/examples/terminal.ts +0 -305
  258. package/src/examples/text-node-demo.ts +0 -416
  259. package/src/examples/text-selection-demo.ts +0 -377
  260. package/src/examples/text-table-demo.ts +0 -503
  261. package/src/examples/text-truncation-demo.ts +0 -481
  262. package/src/examples/text-wrap.ts +0 -757
  263. package/src/examples/texture-loading-demo.ts +0 -259
  264. package/src/examples/timeline-example.ts +0 -670
  265. package/src/examples/transparency-demo.ts +0 -241
  266. package/src/examples/vnode-composition-demo.ts +0 -404
  267. package/src/index.ts +0 -22
  268. package/src/lib/KeyHandler.integration.test.ts +0 -292
  269. package/src/lib/KeyHandler.stopPropagation.test.ts +0 -289
  270. package/src/lib/KeyHandler.test.ts +0 -662
  271. package/src/lib/KeyHandler.ts +0 -222
  272. package/src/lib/RGBA.test.ts +0 -984
  273. package/src/lib/RGBA.ts +0 -204
  274. package/src/lib/ascii.font.ts +0 -330
  275. package/src/lib/border.test.ts +0 -83
  276. package/src/lib/border.ts +0 -168
  277. package/src/lib/bunfs.test.ts +0 -27
  278. package/src/lib/bunfs.ts +0 -18
  279. package/src/lib/clipboard.test.ts +0 -41
  280. package/src/lib/clipboard.ts +0 -47
  281. package/src/lib/clock.ts +0 -31
  282. package/src/lib/data-paths.test.ts +0 -133
  283. package/src/lib/data-paths.ts +0 -109
  284. package/src/lib/debounce.ts +0 -106
  285. package/src/lib/detect-links.test.ts +0 -98
  286. package/src/lib/detect-links.ts +0 -56
  287. package/src/lib/env.test.ts +0 -228
  288. package/src/lib/env.ts +0 -209
  289. package/src/lib/extmarks-history.ts +0 -51
  290. package/src/lib/extmarks-multiwidth.test.ts +0 -322
  291. package/src/lib/extmarks.test.ts +0 -3457
  292. package/src/lib/extmarks.ts +0 -843
  293. package/src/lib/fonts/block.json +0 -405
  294. package/src/lib/fonts/grid.json +0 -265
  295. package/src/lib/fonts/huge.json +0 -741
  296. package/src/lib/fonts/pallet.json +0 -314
  297. package/src/lib/fonts/shade.json +0 -591
  298. package/src/lib/fonts/slick.json +0 -321
  299. package/src/lib/fonts/tiny.json +0 -69
  300. package/src/lib/hast-styled-text.ts +0 -59
  301. package/src/lib/index.ts +0 -21
  302. package/src/lib/keymapping.test.ts +0 -280
  303. package/src/lib/keymapping.ts +0 -87
  304. package/src/lib/objects-in-viewport.test.ts +0 -787
  305. package/src/lib/objects-in-viewport.ts +0 -153
  306. package/src/lib/output.capture.ts +0 -58
  307. package/src/lib/parse.keypress-kitty.protocol.test.ts +0 -340
  308. package/src/lib/parse.keypress-kitty.test.ts +0 -663
  309. package/src/lib/parse.keypress-kitty.ts +0 -439
  310. package/src/lib/parse.keypress.test.ts +0 -1849
  311. package/src/lib/parse.keypress.ts +0 -397
  312. package/src/lib/parse.mouse.test.ts +0 -552
  313. package/src/lib/parse.mouse.ts +0 -232
  314. package/src/lib/paste.ts +0 -16
  315. package/src/lib/queue.ts +0 -65
  316. package/src/lib/renderable.validations.test.ts +0 -87
  317. package/src/lib/renderable.validations.ts +0 -83
  318. package/src/lib/scroll-acceleration.ts +0 -98
  319. package/src/lib/selection.ts +0 -240
  320. package/src/lib/singleton.ts +0 -28
  321. package/src/lib/stdin-parser.test.ts +0 -1676
  322. package/src/lib/stdin-parser.ts +0 -1248
  323. package/src/lib/styled-text.ts +0 -178
  324. package/src/lib/terminal-capability-detection.test.ts +0 -202
  325. package/src/lib/terminal-capability-detection.ts +0 -79
  326. package/src/lib/terminal-palette.test.ts +0 -878
  327. package/src/lib/terminal-palette.ts +0 -383
  328. package/src/lib/tree-sitter/assets/README.md +0 -118
  329. package/src/lib/tree-sitter/assets/update.ts +0 -331
  330. package/src/lib/tree-sitter/assets.d.ts +0 -9
  331. package/src/lib/tree-sitter/cache.test.ts +0 -270
  332. package/src/lib/tree-sitter/client.test.ts +0 -1061
  333. package/src/lib/tree-sitter/client.ts +0 -615
  334. package/src/lib/tree-sitter/default-parsers.ts +0 -80
  335. package/src/lib/tree-sitter/download-utils.ts +0 -148
  336. package/src/lib/tree-sitter/index.ts +0 -28
  337. package/src/lib/tree-sitter/parser.worker.ts +0 -1001
  338. package/src/lib/tree-sitter/parsers-config.ts +0 -75
  339. package/src/lib/tree-sitter/resolve-ft.ts +0 -62
  340. package/src/lib/tree-sitter/types.ts +0 -81
  341. package/src/lib/tree-sitter-styled-text.test.ts +0 -1253
  342. package/src/lib/tree-sitter-styled-text.ts +0 -306
  343. package/src/lib/validate-dir-name.ts +0 -55
  344. package/src/lib/yoga.options.test.ts +0 -628
  345. package/src/lib/yoga.options.ts +0 -346
  346. package/src/plugins/core-slot.ts +0 -579
  347. package/src/plugins/registry.ts +0 -377
  348. package/src/plugins/types.ts +0 -46
  349. package/src/post/filters.ts +0 -888
  350. package/src/renderables/ASCIIFont.ts +0 -219
  351. package/src/renderables/Box.test.ts +0 -160
  352. package/src/renderables/Box.ts +0 -295
  353. package/src/renderables/Code.test.ts +0 -2062
  354. package/src/renderables/Code.ts +0 -357
  355. package/src/renderables/Diff.regression.test.ts +0 -226
  356. package/src/renderables/Diff.test.ts +0 -3027
  357. package/src/renderables/Diff.ts +0 -1209
  358. package/src/renderables/EditBufferRenderable.ts +0 -764
  359. package/src/renderables/FrameBuffer.ts +0 -47
  360. package/src/renderables/Input.test.ts +0 -1228
  361. package/src/renderables/Input.ts +0 -245
  362. package/src/renderables/LineNumberRenderable.ts +0 -675
  363. package/src/renderables/Markdown.ts +0 -1106
  364. package/src/renderables/ScrollBar.ts +0 -422
  365. package/src/renderables/ScrollBox.ts +0 -883
  366. package/src/renderables/Select.test.ts +0 -1010
  367. package/src/renderables/Select.ts +0 -523
  368. package/src/renderables/Slider.test.ts +0 -456
  369. package/src/renderables/Slider.ts +0 -347
  370. package/src/renderables/TabSelect.test.ts +0 -197
  371. package/src/renderables/TabSelect.ts +0 -455
  372. package/src/renderables/Text.selection-buffer.test.ts +0 -123
  373. package/src/renderables/Text.test.ts +0 -2660
  374. package/src/renderables/Text.ts +0 -147
  375. package/src/renderables/TextBufferRenderable.ts +0 -518
  376. package/src/renderables/TextNode.test.ts +0 -1058
  377. package/src/renderables/TextNode.ts +0 -325
  378. package/src/renderables/TextTable.test.ts +0 -1421
  379. package/src/renderables/TextTable.ts +0 -1344
  380. package/src/renderables/Textarea.ts +0 -732
  381. package/src/renderables/TimeToFirstDraw.ts +0 -89
  382. package/src/renderables/__snapshots__/Code.test.ts.snap +0 -13
  383. package/src/renderables/__snapshots__/Diff.test.ts.snap +0 -785
  384. package/src/renderables/__snapshots__/Text.test.ts.snap +0 -421
  385. package/src/renderables/__snapshots__/TextTable.test.ts.snap +0 -215
  386. package/src/renderables/__tests__/LineNumberRenderable.scrollbox-simple.test.ts +0 -144
  387. package/src/renderables/__tests__/LineNumberRenderable.scrollbox.test.ts +0 -816
  388. package/src/renderables/__tests__/LineNumberRenderable.test.ts +0 -1787
  389. package/src/renderables/__tests__/LineNumberRenderable.wrapping.test.ts +0 -85
  390. package/src/renderables/__tests__/Markdown.test.ts +0 -2287
  391. package/src/renderables/__tests__/MultiRenderable.selection.test.ts +0 -87
  392. package/src/renderables/__tests__/Textarea.buffer.test.ts +0 -682
  393. package/src/renderables/__tests__/Textarea.destroyed-events.test.ts +0 -675
  394. package/src/renderables/__tests__/Textarea.editing.test.ts +0 -2041
  395. package/src/renderables/__tests__/Textarea.error-handling.test.ts +0 -35
  396. package/src/renderables/__tests__/Textarea.events.test.ts +0 -738
  397. package/src/renderables/__tests__/Textarea.highlights.test.ts +0 -590
  398. package/src/renderables/__tests__/Textarea.keybinding.test.ts +0 -3149
  399. package/src/renderables/__tests__/Textarea.paste.test.ts +0 -357
  400. package/src/renderables/__tests__/Textarea.rendering.test.ts +0 -1864
  401. package/src/renderables/__tests__/Textarea.scroll.test.ts +0 -733
  402. package/src/renderables/__tests__/Textarea.selection.test.ts +0 -1590
  403. package/src/renderables/__tests__/Textarea.stress.test.ts +0 -670
  404. package/src/renderables/__tests__/Textarea.undo-redo.test.ts +0 -383
  405. package/src/renderables/__tests__/Textarea.visual-lines.test.ts +0 -310
  406. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.code.test.ts.snap +0 -221
  407. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox-simple.test.ts.snap +0 -89
  408. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox.test.ts.snap +0 -457
  409. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.test.ts.snap +0 -158
  410. package/src/renderables/__tests__/__snapshots__/Textarea.rendering.test.ts.snap +0 -387
  411. package/src/renderables/__tests__/markdown-parser.test.ts +0 -217
  412. package/src/renderables/__tests__/renderable-test-utils.ts +0 -60
  413. package/src/renderables/composition/README.md +0 -8
  414. package/src/renderables/composition/VRenderable.ts +0 -32
  415. package/src/renderables/composition/constructs.ts +0 -127
  416. package/src/renderables/composition/vnode.ts +0 -289
  417. package/src/renderables/index.ts +0 -22
  418. package/src/renderables/markdown-parser.ts +0 -66
  419. package/src/renderer.ts +0 -2363
  420. package/src/runtime-plugin-support.ts +0 -39
  421. package/src/runtime-plugin.ts +0 -144
  422. package/src/syntax-style.test.ts +0 -841
  423. package/src/syntax-style.ts +0 -264
  424. package/src/testing/README.md +0 -210
  425. package/src/testing/capture-spans.test.ts +0 -194
  426. package/src/testing/integration.test.ts +0 -276
  427. package/src/testing/manual-clock.ts +0 -106
  428. package/src/testing/mock-keys.test.ts +0 -1356
  429. package/src/testing/mock-keys.ts +0 -449
  430. package/src/testing/mock-mouse.test.ts +0 -218
  431. package/src/testing/mock-mouse.ts +0 -247
  432. package/src/testing/mock-tree-sitter-client.ts +0 -73
  433. package/src/testing/spy.ts +0 -13
  434. package/src/testing/test-recorder.test.ts +0 -415
  435. package/src/testing/test-recorder.ts +0 -145
  436. package/src/testing/test-renderer.ts +0 -116
  437. package/src/testing.ts +0 -7
  438. package/src/tests/__snapshots__/absolute-positioning.snapshot.test.ts.snap +0 -481
  439. package/src/tests/__snapshots__/renderable.snapshot.test.ts.snap +0 -19
  440. package/src/tests/__snapshots__/scrollbox.test.ts.snap +0 -29
  441. package/src/tests/absolute-positioning.snapshot.test.ts +0 -638
  442. package/src/tests/allocator-stats.test.ts +0 -38
  443. package/src/tests/destroy-during-render.test.ts +0 -200
  444. package/src/tests/hover-cursor.test.ts +0 -98
  445. package/src/tests/native-span-feed-async.test.ts +0 -173
  446. package/src/tests/native-span-feed-close.test.ts +0 -120
  447. package/src/tests/native-span-feed-coverage.test.ts +0 -227
  448. package/src/tests/native-span-feed-edge-cases.test.ts +0 -352
  449. package/src/tests/native-span-feed-use-after-free.test.ts +0 -45
  450. package/src/tests/opacity.test.ts +0 -123
  451. package/src/tests/renderable.snapshot.test.ts +0 -524
  452. package/src/tests/renderable.test.ts +0 -1281
  453. package/src/tests/renderer.console-startup.test.ts +0 -65
  454. package/src/tests/renderer.control.test.ts +0 -364
  455. package/src/tests/renderer.core-slot-binding.test.ts +0 -952
  456. package/src/tests/renderer.cursor.test.ts +0 -26
  457. package/src/tests/renderer.destroy-during-render.test.ts +0 -110
  458. package/src/tests/renderer.focus-restore.test.ts +0 -228
  459. package/src/tests/renderer.focus.test.ts +0 -251
  460. package/src/tests/renderer.idle.test.ts +0 -219
  461. package/src/tests/renderer.input.test.ts +0 -2145
  462. package/src/tests/renderer.kitty-flags.test.ts +0 -195
  463. package/src/tests/renderer.mouse.test.ts +0 -1269
  464. package/src/tests/renderer.palette.test.ts +0 -629
  465. package/src/tests/renderer.selection.test.ts +0 -49
  466. package/src/tests/renderer.slot-registry.test.ts +0 -649
  467. package/src/tests/renderer.useMouse.test.ts +0 -50
  468. package/src/tests/runtime-plugin-support.fixture.ts +0 -11
  469. package/src/tests/runtime-plugin-support.test.ts +0 -28
  470. package/src/tests/runtime-plugin.fixture.ts +0 -40
  471. package/src/tests/runtime-plugin.test.ts +0 -190
  472. package/src/tests/scrollbox-culling-bug.test.ts +0 -114
  473. package/src/tests/scrollbox-hitgrid-resize.test.ts +0 -136
  474. package/src/tests/scrollbox-hitgrid.test.ts +0 -909
  475. package/src/tests/scrollbox.test.ts +0 -1530
  476. package/src/tests/wrap-resize-perf.test.ts +0 -229
  477. package/src/tests/yoga-setters.test.ts +0 -921
  478. package/src/text-buffer-view.test.ts +0 -705
  479. package/src/text-buffer-view.ts +0 -189
  480. package/src/text-buffer.test.ts +0 -347
  481. package/src/text-buffer.ts +0 -250
  482. package/src/types.ts +0 -152
  483. package/src/utils.ts +0 -88
  484. package/src/zig/ansi.zig +0 -268
  485. package/src/zig/bench/README.md +0 -50
  486. package/src/zig/bench/buffer-draw-text-buffer_bench.zig +0 -887
  487. package/src/zig/bench/edit-buffer_bench.zig +0 -476
  488. package/src/zig/bench/native-span-feed_bench.zig +0 -100
  489. package/src/zig/bench/rope-markers_bench.zig +0 -713
  490. package/src/zig/bench/rope_bench.zig +0 -514
  491. package/src/zig/bench/styled-text_bench.zig +0 -470
  492. package/src/zig/bench/text-buffer-coords_bench.zig +0 -362
  493. package/src/zig/bench/text-buffer-view_bench.zig +0 -459
  494. package/src/zig/bench/text-chunk-graphemes_bench.zig +0 -273
  495. package/src/zig/bench/utf8_bench.zig +0 -799
  496. package/src/zig/bench-utils.zig +0 -431
  497. package/src/zig/bench.zig +0 -217
  498. package/src/zig/buffer.zig +0 -2223
  499. package/src/zig/build.zig +0 -289
  500. package/src/zig/build.zig.zon +0 -16
  501. package/src/zig/edit-buffer.zig +0 -825
  502. package/src/zig/editor-view.zig +0 -802
  503. package/src/zig/event-bus.zig +0 -13
  504. package/src/zig/event-emitter.zig +0 -65
  505. package/src/zig/file-logger.zig +0 -92
  506. package/src/zig/grapheme.zig +0 -599
  507. package/src/zig/lib.zig +0 -1834
  508. package/src/zig/link.zig +0 -333
  509. package/src/zig/logger.zig +0 -43
  510. package/src/zig/mem-registry.zig +0 -125
  511. package/src/zig/native-span-feed-bench-lib.zig +0 -7
  512. package/src/zig/native-span-feed.zig +0 -708
  513. package/src/zig/renderer.zig +0 -1386
  514. package/src/zig/rope.zig +0 -1220
  515. package/src/zig/syntax-style.zig +0 -161
  516. package/src/zig/terminal.zig +0 -975
  517. package/src/zig/test.zig +0 -70
  518. package/src/zig/tests/README.md +0 -18
  519. package/src/zig/tests/buffer_test.zig +0 -2526
  520. package/src/zig/tests/edit-buffer-history_test.zig +0 -271
  521. package/src/zig/tests/edit-buffer_test.zig +0 -1689
  522. package/src/zig/tests/editor-view_test.zig +0 -3299
  523. package/src/zig/tests/event-emitter_test.zig +0 -249
  524. package/src/zig/tests/grapheme_test.zig +0 -1304
  525. package/src/zig/tests/link_test.zig +0 -190
  526. package/src/zig/tests/mem-registry_test.zig +0 -473
  527. package/src/zig/tests/memory_leak_regression_test.zig +0 -159
  528. package/src/zig/tests/native-span-feed_test.zig +0 -1264
  529. package/src/zig/tests/renderer_test.zig +0 -1010
  530. package/src/zig/tests/rope-nested_test.zig +0 -712
  531. package/src/zig/tests/rope_fuzz_test.zig +0 -238
  532. package/src/zig/tests/rope_test.zig +0 -2362
  533. package/src/zig/tests/segment-merge.test.zig +0 -148
  534. package/src/zig/tests/syntax-style_test.zig +0 -557
  535. package/src/zig/tests/terminal_test.zig +0 -719
  536. package/src/zig/tests/text-buffer-drawing_test.zig +0 -3237
  537. package/src/zig/tests/text-buffer-highlights_test.zig +0 -666
  538. package/src/zig/tests/text-buffer-iterators_test.zig +0 -776
  539. package/src/zig/tests/text-buffer-segment_test.zig +0 -320
  540. package/src/zig/tests/text-buffer-selection_test.zig +0 -1035
  541. package/src/zig/tests/text-buffer-selection_viewport_test.zig +0 -358
  542. package/src/zig/tests/text-buffer-view_test.zig +0 -3649
  543. package/src/zig/tests/text-buffer_test.zig +0 -2191
  544. package/src/zig/tests/unicode-width-map.zon +0 -3909
  545. package/src/zig/tests/utf8_no_zwj_test.zig +0 -260
  546. package/src/zig/tests/utf8_test.zig +0 -4057
  547. package/src/zig/tests/utf8_wcwidth_cursor_test.zig +0 -267
  548. package/src/zig/tests/utf8_wcwidth_test.zig +0 -357
  549. package/src/zig/tests/word-wrap-editing_test.zig +0 -498
  550. package/src/zig/tests/wrap-cache-perf_test.zig +0 -113
  551. package/src/zig/text-buffer-iterators.zig +0 -499
  552. package/src/zig/text-buffer-segment.zig +0 -404
  553. package/src/zig/text-buffer-view.zig +0 -1371
  554. package/src/zig/text-buffer.zig +0 -1180
  555. package/src/zig/utf8.zig +0 -1948
  556. package/src/zig/utils.zig +0 -9
  557. package/src/zig-structs.ts +0 -261
  558. package/src/zig.ts +0 -3843
  559. package/tsconfig.build.json +0 -22
  560. package/tsconfig.json +0 -28
  561. /package/{src/lib/tree-sitter/assets → assets}/javascript/highlights.scm +0 -0
  562. /package/{src/lib/tree-sitter/assets → assets}/javascript/tree-sitter-javascript.wasm +0 -0
  563. /package/{src/lib/tree-sitter/assets → assets}/markdown/highlights.scm +0 -0
  564. /package/{src/lib/tree-sitter/assets → assets}/markdown/injections.scm +0 -0
  565. /package/{src/lib/tree-sitter/assets → assets}/markdown/tree-sitter-markdown.wasm +0 -0
  566. /package/{src/lib/tree-sitter/assets → assets}/markdown_inline/highlights.scm +0 -0
  567. /package/{src/lib/tree-sitter/assets → assets}/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
  568. /package/{src/lib/tree-sitter/assets → assets}/typescript/highlights.scm +0 -0
  569. /package/{src/lib/tree-sitter/assets → assets}/typescript/tree-sitter-typescript.wasm +0 -0
  570. /package/{src/lib/tree-sitter/assets → assets}/zig/highlights.scm +0 -0
  571. /package/{src/lib/tree-sitter/assets → assets}/zig/tree-sitter-zig.wasm +0 -0
package/src/zig/lib.zig DELETED
@@ -1,1834 +0,0 @@
1
- const std = @import("std");
2
- const build_options = @import("build_options");
3
- const Allocator = std.mem.Allocator;
4
-
5
- const ansi = @import("ansi.zig");
6
- const buffer = @import("buffer.zig");
7
- const renderer = @import("renderer.zig");
8
- const gp = @import("grapheme.zig");
9
- const link = @import("link.zig");
10
- const text_buffer = @import("text-buffer.zig");
11
- const text_buffer_view = @import("text-buffer-view.zig");
12
- const edit_buffer_mod = @import("edit-buffer.zig");
13
- const editor_view = @import("editor-view.zig");
14
- const syntax_style = @import("syntax-style.zig");
15
- const terminal = @import("terminal.zig");
16
- const utf8 = @import("utf8.zig");
17
- const logger = @import("logger.zig");
18
- const event_bus = @import("event-bus.zig");
19
- const utils = @import("utils.zig");
20
- const native_span_feed = @import("native-span-feed.zig");
21
-
22
- pub const OptimizedBuffer = buffer.OptimizedBuffer;
23
- pub const CliRenderer = renderer.CliRenderer;
24
- pub const Terminal = terminal.Terminal;
25
- pub const RGBA = buffer.RGBA;
26
-
27
- comptime {
28
- _ = native_span_feed;
29
- }
30
-
31
- export fn setLogCallback(callback: ?*const fn (level: u8, msgPtr: [*]const u8, msgLen: usize) callconv(.c) void) void {
32
- logger.setLogCallback(callback);
33
- }
34
-
35
- export fn setEventCallback(callback: ?*const fn (namePtr: [*]const u8, nameLen: usize, dataPtr: [*]const u8, dataLen: usize) callconv(.c) void) void {
36
- event_bus.setEventCallback(callback);
37
- }
38
-
39
- var gpa = std.heap.GeneralPurposeAllocator(.{
40
- .enable_memory_limit = build_options.gpa_safe_stats,
41
- .safety = build_options.gpa_safe_stats,
42
- }){};
43
- const globalAllocator = gpa.allocator();
44
- var arena = std.heap.ArenaAllocator.init(globalAllocator);
45
- const globalArena = arena.allocator();
46
-
47
- pub const ExternalBuildOptions = extern struct {
48
- gpa_safe_stats: bool,
49
- gpa_memory_limit_tracking: bool,
50
- };
51
-
52
- pub const ExternalAllocatorStats = extern struct {
53
- total_requested_bytes: u64,
54
- active_allocations: u64,
55
- small_allocations: u64,
56
- large_allocations: u64,
57
- requested_bytes_valid: bool,
58
- };
59
-
60
- fn toNonNegativeU64(value: anytype) u64 {
61
- const ValueType = @TypeOf(value);
62
-
63
- return switch (@typeInfo(ValueType)) {
64
- .int => |int_info| if (int_info.signedness == .signed) blk: {
65
- const signed_value: i64 = @intCast(value);
66
- if (signed_value <= 0) break :blk 0;
67
- break :blk @intCast(signed_value);
68
- } else @intCast(value),
69
- .comptime_int => blk: {
70
- if (value <= 0) break :blk 0;
71
- break :blk @intCast(value);
72
- },
73
- else => 0,
74
- };
75
- }
76
-
77
- const RequestedBytesInfo = struct {
78
- bytes: u64,
79
- valid: bool,
80
- };
81
-
82
- fn sanitizeRequestedBytes(value: u64) RequestedBytesInfo {
83
- const signed_value: i64 = @bitCast(value);
84
- if (signed_value < 0) {
85
- return .{ .bytes = 0, .valid = false };
86
- }
87
-
88
- return .{ .bytes = @intCast(signed_value), .valid = true };
89
- }
90
-
91
- fn queryStatsField(comptime field_names: []const []const u8) ?u64 {
92
- if (!@hasDecl(@TypeOf(gpa), "queryStats")) {
93
- return null;
94
- }
95
-
96
- const stats = gpa.queryStats();
97
- const StatsType = @TypeOf(stats);
98
-
99
- inline for (field_names) |field_name| {
100
- if (@hasField(StatsType, field_name)) {
101
- return toNonNegativeU64(@field(stats, field_name));
102
- }
103
- }
104
-
105
- return null;
106
- }
107
-
108
- fn getTotalRequestedBytesInfo() RequestedBytesInfo {
109
- if (!build_options.gpa_safe_stats) {
110
- return .{ .bytes = 0, .valid = false };
111
- }
112
-
113
- if (queryStatsField(&.{"total_requested_bytes"})) |value| {
114
- return sanitizeRequestedBytes(value);
115
- }
116
-
117
- if (@hasField(@TypeOf(gpa), "total_requested_bytes")) {
118
- if (@TypeOf(gpa.total_requested_bytes) == void) {
119
- return .{ .bytes = 0, .valid = false };
120
- }
121
-
122
- return sanitizeRequestedBytes(toNonNegativeU64(gpa.total_requested_bytes));
123
- }
124
-
125
- return .{ .bytes = 0, .valid = false };
126
- }
127
-
128
- fn getSmallAllocationCount() u64 {
129
- if (queryStatsField(&.{ "small_allocations", "small_allocation_count" })) |value| {
130
- return value;
131
- }
132
-
133
- var total: u64 = 0;
134
- for (gpa.buckets) |bucket_head| {
135
- var current = bucket_head;
136
- while (current) |bucket| {
137
- const allocated: u64 = @intCast(bucket.allocated_count);
138
- const freed: u64 = @intCast(bucket.freed_count);
139
- if (allocated >= freed) {
140
- total += allocated - freed;
141
- }
142
- current = bucket.next;
143
- }
144
- }
145
-
146
- return total;
147
- }
148
-
149
- fn getLargeAllocationCount() u64 {
150
- if (queryStatsField(&.{ "large_allocations", "large_allocation_count" })) |value| {
151
- return value;
152
- }
153
-
154
- return @intCast(gpa.large_allocations.count());
155
- }
156
-
157
- export fn createNativeSpanFeed(options_ptr: ?*const native_span_feed.Options) ?*native_span_feed.Stream {
158
- return native_span_feed.createNativeSpanFeedWithAllocator(globalAllocator, options_ptr);
159
- }
160
-
161
-
162
-
163
- export fn getArenaAllocatedBytes() usize {
164
- return arena.queryCapacity();
165
- }
166
-
167
- export fn getBuildOptions(out_ptr: *ExternalBuildOptions) void {
168
- out_ptr.* = .{
169
- .gpa_safe_stats = build_options.gpa_safe_stats,
170
- .gpa_memory_limit_tracking = build_options.gpa_safe_stats,
171
- };
172
- }
173
-
174
- export fn getAllocatorStats(out_ptr: *ExternalAllocatorStats) void {
175
- const small_allocations = getSmallAllocationCount();
176
- const large_allocations = getLargeAllocationCount();
177
- const active_allocations = small_allocations + large_allocations;
178
- const requested_bytes = getTotalRequestedBytesInfo();
179
-
180
- out_ptr.* = .{
181
- .total_requested_bytes = requested_bytes.bytes,
182
- .active_allocations = active_allocations,
183
- .small_allocations = small_allocations,
184
- .large_allocations = large_allocations,
185
- .requested_bytes_valid = requested_bytes.valid,
186
- };
187
- }
188
-
189
- export fn createRenderer(width: u32, height: u32, testing: bool, remote: bool) ?*renderer.CliRenderer {
190
- if (width == 0 or height == 0) {
191
- logger.warn("Invalid renderer dimensions: {}x{}", .{ width, height });
192
- return null;
193
- }
194
-
195
- const pool = gp.initGlobalPool(globalArena);
196
- _ = link.initGlobalLinkPool(globalArena);
197
- return renderer.CliRenderer.createWithOptions(globalAllocator, width, height, pool, testing, remote) catch |err| {
198
- logger.err("Failed to create renderer: {}", .{err});
199
- return null;
200
- };
201
- }
202
-
203
- export fn setTerminalEnvVar(rendererPtr: *renderer.CliRenderer, keyPtr: [*]const u8, keyLen: usize, valuePtr: [*]const u8, valueLen: usize) bool {
204
- const key = keyPtr[0..keyLen];
205
- const value = valuePtr[0..valueLen];
206
- return rendererPtr.setTerminalEnvVar(key, value);
207
- }
208
-
209
- export fn setUseThread(rendererPtr: *renderer.CliRenderer, useThread: bool) void {
210
- rendererPtr.setUseThread(useThread);
211
- }
212
-
213
- export fn destroyRenderer(rendererPtr: *renderer.CliRenderer) void {
214
- rendererPtr.destroy();
215
- }
216
-
217
- export fn setBackgroundColor(rendererPtr: *renderer.CliRenderer, color: [*]const f32) void {
218
- rendererPtr.setBackgroundColor(utils.f32PtrToRGBA(color));
219
- }
220
-
221
- export fn setRenderOffset(rendererPtr: *renderer.CliRenderer, offset: u32) void {
222
- rendererPtr.setRenderOffset(offset);
223
- }
224
-
225
- export fn updateStats(rendererPtr: *renderer.CliRenderer, time: f64, fps: u32, frameCallbackTime: f64) void {
226
- rendererPtr.updateStats(time, fps, frameCallbackTime);
227
- }
228
-
229
- export fn updateMemoryStats(rendererPtr: *renderer.CliRenderer, heapUsed: u32, heapTotal: u32, arrayBuffers: u32) void {
230
- rendererPtr.updateMemoryStats(heapUsed, heapTotal, arrayBuffers);
231
- }
232
-
233
- export fn getNextBuffer(rendererPtr: *renderer.CliRenderer) *buffer.OptimizedBuffer {
234
- return rendererPtr.getNextBuffer();
235
- }
236
-
237
- export fn getCurrentBuffer(rendererPtr: *renderer.CliRenderer) *buffer.OptimizedBuffer {
238
- return rendererPtr.getCurrentBuffer();
239
- }
240
-
241
- const OutputSlice = extern struct {
242
- ptr: [*]const u8,
243
- len: usize,
244
- };
245
-
246
- export fn getLastOutputForTest(rendererPtr: *renderer.CliRenderer, outSlice: *OutputSlice) void {
247
- const output = rendererPtr.getLastOutputForTest();
248
- outSlice.ptr = output.ptr;
249
- outSlice.len = output.len;
250
- }
251
-
252
- export fn setHyperlinksCapability(rendererPtr: *renderer.CliRenderer, enabled: bool) void {
253
- rendererPtr.terminal.caps.hyperlinks = enabled;
254
- }
255
-
256
- export fn clearGlobalLinkPool() void {
257
- link.deinitGlobalLinkPool();
258
- }
259
-
260
- export fn getBufferWidth(bufferPtr: *buffer.OptimizedBuffer) u32 {
261
- return bufferPtr.width;
262
- }
263
-
264
- export fn getBufferHeight(bufferPtr: *buffer.OptimizedBuffer) u32 {
265
- return bufferPtr.height;
266
- }
267
-
268
- export fn render(rendererPtr: *renderer.CliRenderer, force: bool) void {
269
- rendererPtr.render(force);
270
- }
271
-
272
- export fn createOptimizedBuffer(width: u32, height: u32, respectAlpha: bool, widthMethod: u8, idPtr: [*]const u8, idLen: usize) ?*buffer.OptimizedBuffer {
273
- if (width == 0 or height == 0) {
274
- logger.warn("Invalid buffer dimensions: {}x{}", .{ width, height });
275
- return null;
276
- }
277
-
278
- const pool = gp.initGlobalPool(globalArena);
279
- const link_pool = link.initGlobalLinkPool(globalArena);
280
- const wMethod: utf8.WidthMethod = if (widthMethod == 0) .wcwidth else .unicode;
281
- const id = idPtr[0..idLen];
282
-
283
- return buffer.OptimizedBuffer.init(globalAllocator, width, height, .{
284
- .respectAlpha = respectAlpha,
285
- .pool = pool,
286
- .width_method = wMethod,
287
- .id = id,
288
- .link_pool = link_pool,
289
- }) catch |err| {
290
- logger.err("Failed to create optimized buffer: {}", .{err});
291
- return null;
292
- };
293
- }
294
-
295
- export fn destroyOptimizedBuffer(bufferPtr: *buffer.OptimizedBuffer) void {
296
- bufferPtr.deinit();
297
- }
298
-
299
- export fn destroyFrameBuffer(frameBufferPtr: *buffer.OptimizedBuffer) void {
300
- destroyOptimizedBuffer(frameBufferPtr);
301
- }
302
-
303
- export fn drawFrameBuffer(targetPtr: *buffer.OptimizedBuffer, destX: i32, destY: i32, frameBuffer: *buffer.OptimizedBuffer, sourceX: u32, sourceY: u32, sourceWidth: u32, sourceHeight: u32) void {
304
- const srcX = if (sourceX == 0) null else sourceX;
305
- const srcY = if (sourceY == 0) null else sourceY;
306
- const srcWidth = if (sourceWidth == 0) null else sourceWidth;
307
- const srcHeight = if (sourceHeight == 0) null else sourceHeight;
308
-
309
- targetPtr.drawFrameBuffer(destX, destY, frameBuffer, srcX, srcY, srcWidth, srcHeight);
310
- }
311
-
312
- export fn setCursorPosition(rendererPtr: *renderer.CliRenderer, x: i32, y: i32, visible: bool) void {
313
- rendererPtr.terminal.setCursorPosition(@intCast(@max(1, x)), @intCast(@max(1, y)), visible);
314
- }
315
-
316
- pub const ExternalCapabilities = extern struct {
317
- kitty_keyboard: bool,
318
- kitty_graphics: bool,
319
- rgb: bool,
320
- unicode: u8, // 0 = wcwidth, 1 = unicode
321
- sgr_pixels: bool,
322
- color_scheme_updates: bool,
323
- explicit_width: bool,
324
- scaled_text: bool,
325
- sixel: bool,
326
- focus_tracking: bool,
327
- sync: bool,
328
- bracketed_paste: bool,
329
- hyperlinks: bool,
330
- osc52: bool,
331
- explicit_cursor_positioning: bool,
332
- term_name_ptr: [*]const u8,
333
- term_name_len: usize,
334
- term_version_ptr: [*]const u8,
335
- term_version_len: usize,
336
- term_from_xtversion: bool,
337
- };
338
-
339
- export fn getTerminalCapabilities(rendererPtr: *renderer.CliRenderer, capsPtr: *ExternalCapabilities) void {
340
- const caps = rendererPtr.getTerminalCapabilities();
341
- const term = &rendererPtr.terminal;
342
-
343
- capsPtr.* = .{
344
- .kitty_keyboard = caps.kitty_keyboard,
345
- .kitty_graphics = caps.kitty_graphics,
346
- .rgb = caps.rgb,
347
- .unicode = if (caps.unicode == .wcwidth) 0 else 1,
348
- .sgr_pixels = caps.sgr_pixels,
349
- .color_scheme_updates = caps.color_scheme_updates,
350
- .explicit_width = caps.explicit_width,
351
- .scaled_text = caps.scaled_text,
352
- .sixel = caps.sixel,
353
- .focus_tracking = caps.focus_tracking,
354
- .sync = caps.sync,
355
- .bracketed_paste = caps.bracketed_paste,
356
- .hyperlinks = caps.hyperlinks,
357
- .osc52 = caps.osc52,
358
- .explicit_cursor_positioning = caps.explicit_cursor_positioning,
359
- .term_name_ptr = &term.term_info.name,
360
- .term_name_len = term.term_info.name_len,
361
- .term_version_ptr = &term.term_info.version,
362
- .term_version_len = term.term_info.version_len,
363
- .term_from_xtversion = term.term_info.from_xtversion,
364
- };
365
- }
366
-
367
- export fn processCapabilityResponse(rendererPtr: *renderer.CliRenderer, responsePtr: [*]const u8, responseLen: usize) void {
368
- const response = responsePtr[0..responseLen];
369
- rendererPtr.processCapabilityResponse(response);
370
- }
371
-
372
- export fn setCursorColor(rendererPtr: *renderer.CliRenderer, color: [*]const f32) void {
373
- rendererPtr.terminal.setCursorColor(utils.f32PtrToRGBA(color));
374
- }
375
-
376
- pub const CursorStyleOptions = extern struct {
377
- style: u8,
378
- blinking: u8,
379
- color: ?[*]const f32,
380
- cursor: u8,
381
- };
382
-
383
- export fn setCursorStyleOptions(rendererPtr: *renderer.CliRenderer, options: *const CursorStyleOptions) void {
384
- const current = rendererPtr.terminal.getCursorStyle();
385
-
386
- const style = if (options.style <= 3) @as(terminal.CursorStyle, @enumFromInt(options.style)) else current.style;
387
- const blinking = if (options.blinking <= 1) options.blinking == 1 else current.blinking;
388
-
389
- if (options.style <= 3 or options.blinking <= 1) {
390
- rendererPtr.terminal.setCursorStyle(style, blinking);
391
- }
392
- if (options.color) |rgba| {
393
- rendererPtr.terminal.setCursorColor(utils.f32PtrToRGBA(rgba));
394
- }
395
- if (options.cursor <= 5) {
396
- rendererPtr.terminal.setMousePointerStyle(@enumFromInt(options.cursor));
397
- }
398
- }
399
-
400
- pub const ExternalCursorState = extern struct {
401
- x: u32,
402
- y: u32,
403
- visible: bool,
404
- style: u8,
405
- blinking: bool,
406
- r: f32,
407
- g: f32,
408
- b: f32,
409
- a: f32,
410
- };
411
-
412
- export fn getCursorState(rendererPtr: *renderer.CliRenderer, outPtr: *ExternalCursorState) void {
413
- const pos = rendererPtr.terminal.getCursorPosition();
414
- const style = rendererPtr.terminal.getCursorStyle();
415
- const color = rendererPtr.terminal.getCursorColor();
416
-
417
- const styleTag: u8 = switch (style.style) {
418
- .block => 0,
419
- .line => 1,
420
- .underline => 2,
421
- .default => 3,
422
- };
423
-
424
- outPtr.* = .{
425
- .x = pos.x,
426
- .y = pos.y,
427
- .visible = pos.visible,
428
- .style = styleTag,
429
- .blinking = style.blinking,
430
- .r = color[0],
431
- .g = color[1],
432
- .b = color[2],
433
- .a = color[3],
434
- };
435
- }
436
-
437
- export fn setDebugOverlay(rendererPtr: *renderer.CliRenderer, enabled: bool, corner: u8) void {
438
- const cornerEnum: renderer.DebugOverlayCorner = switch (corner) {
439
- 0 => .topLeft,
440
- 1 => .topRight,
441
- 2 => .bottomLeft,
442
- else => .bottomRight,
443
- };
444
-
445
- rendererPtr.setDebugOverlay(enabled, cornerEnum);
446
- }
447
-
448
- export fn clearTerminal(rendererPtr: *renderer.CliRenderer) void {
449
- rendererPtr.clearTerminal();
450
- }
451
-
452
- export fn setTerminalTitle(rendererPtr: *renderer.CliRenderer, titlePtr: [*]const u8, titleLen: usize) void {
453
- const title = titlePtr[0..titleLen];
454
- rendererPtr.setTerminalTitle(title);
455
- }
456
-
457
- export fn copyToClipboardOSC52(rendererPtr: *renderer.CliRenderer, target: u8, payloadPtr: [*]const u8, payloadLen: usize) bool {
458
- const targetEnum = std.meta.intToEnum(terminal.ClipboardTarget, target) catch .clipboard;
459
- const payload = payloadPtr[0..payloadLen];
460
- return rendererPtr.copyToClipboardOSC52(targetEnum, payload);
461
- }
462
-
463
- export fn clearClipboardOSC52(rendererPtr: *renderer.CliRenderer, target: u8) bool {
464
- const targetEnum = std.meta.intToEnum(terminal.ClipboardTarget, target) catch .clipboard;
465
- return rendererPtr.clearClipboardOSC52(targetEnum);
466
- }
467
-
468
- // Buffer functions
469
- export fn bufferClear(bufferPtr: *buffer.OptimizedBuffer, bg: [*]const f32) void {
470
- bufferPtr.clear(utils.f32PtrToRGBA(bg), null) catch {};
471
- }
472
-
473
- export fn bufferGetCharPtr(bufferPtr: *buffer.OptimizedBuffer) [*]u32 {
474
- return bufferPtr.getCharPtr();
475
- }
476
-
477
- export fn bufferGetFgPtr(bufferPtr: *buffer.OptimizedBuffer) [*]RGBA {
478
- return bufferPtr.getFgPtr();
479
- }
480
-
481
- export fn bufferGetBgPtr(bufferPtr: *buffer.OptimizedBuffer) [*]RGBA {
482
- return bufferPtr.getBgPtr();
483
- }
484
-
485
- export fn bufferGetAttributesPtr(bufferPtr: *buffer.OptimizedBuffer) [*]u32 {
486
- return bufferPtr.getAttributesPtr();
487
- }
488
-
489
- export fn bufferGetRespectAlpha(bufferPtr: *buffer.OptimizedBuffer) bool {
490
- return bufferPtr.getRespectAlpha();
491
- }
492
-
493
- export fn bufferSetRespectAlpha(bufferPtr: *buffer.OptimizedBuffer, respectAlpha: bool) void {
494
- bufferPtr.setRespectAlpha(respectAlpha);
495
- }
496
-
497
- export fn bufferGetId(bufferPtr: *buffer.OptimizedBuffer, outPtr: [*]u8, maxLen: usize) usize {
498
- const id = bufferPtr.getId();
499
- const copyLen = @min(id.len, maxLen);
500
- @memcpy(outPtr[0..copyLen], id[0..copyLen]);
501
- return copyLen;
502
- }
503
-
504
- export fn bufferGetRealCharSize(bufferPtr: *buffer.OptimizedBuffer) u32 {
505
- return bufferPtr.getRealCharSize();
506
- }
507
-
508
- export fn bufferWriteResolvedChars(bufferPtr: *buffer.OptimizedBuffer, outputPtr: [*]u8, outputLen: usize, addLineBreaks: bool) u32 {
509
- const output_slice = outputPtr[0..outputLen];
510
- return bufferPtr.writeResolvedChars(output_slice, addLineBreaks) catch 0;
511
- }
512
-
513
- export fn bufferDrawText(bufferPtr: *buffer.OptimizedBuffer, text: [*]const u8, textLen: usize, x: u32, y: u32, fg: [*]const f32, bg: ?[*]const f32, attributes: u32) void {
514
- const rgbaFg = utils.f32PtrToRGBA(fg);
515
- const rgbaBg = if (bg) |bgPtr| utils.f32PtrToRGBA(bgPtr) else null;
516
- bufferPtr.drawText(text[0..textLen], x, y, rgbaFg, rgbaBg, attributes) catch {};
517
- }
518
-
519
- export fn bufferSetCellWithAlphaBlending(bufferPtr: *buffer.OptimizedBuffer, x: u32, y: u32, char: u32, fg: [*]const f32, bg: [*]const f32, attributes: u32) void {
520
- const rgbaFg = utils.f32PtrToRGBA(fg);
521
- const rgbaBg = utils.f32PtrToRGBA(bg);
522
- bufferPtr.setCellWithAlphaBlending(x, y, char, rgbaFg, rgbaBg, attributes) catch {};
523
- }
524
-
525
- export fn bufferSetCell(bufferPtr: *buffer.OptimizedBuffer, x: u32, y: u32, char: u32, fg: [*]const f32, bg: [*]const f32, attributes: u32) void {
526
- const rgbaFg = utils.f32PtrToRGBA(fg);
527
- const rgbaBg = utils.f32PtrToRGBA(bg);
528
- const cell = buffer.Cell{
529
- .char = char,
530
- .fg = rgbaFg,
531
- .bg = rgbaBg,
532
- .attributes = attributes,
533
- };
534
- bufferPtr.set(x, y, cell);
535
- }
536
-
537
- export fn bufferFillRect(bufferPtr: *buffer.OptimizedBuffer, x: u32, y: u32, width: u32, height: u32, bg: [*]const f32) void {
538
- const rgbaBg = utils.f32PtrToRGBA(bg);
539
- bufferPtr.fillRect(x, y, width, height, rgbaBg) catch {};
540
- }
541
-
542
- export fn bufferDrawPackedBuffer(bufferPtr: *buffer.OptimizedBuffer, data: [*]const u8, dataLen: usize, posX: u32, posY: u32, terminalWidthCells: u32, terminalHeightCells: u32) void {
543
- bufferPtr.drawPackedBuffer(data, dataLen, posX, posY, terminalWidthCells, terminalHeightCells);
544
- }
545
-
546
- export fn bufferDrawGrayscaleBuffer(bufferPtr: *buffer.OptimizedBuffer, posX: i32, posY: i32, intensities: [*]const f32, srcWidth: u32, srcHeight: u32, fg: ?[*]const f32, bg: ?[*]const f32) void {
547
- const rgbaFg = if (fg) |fgPtr| utils.f32PtrToRGBA(fgPtr) else null;
548
- const rgbaBg = if (bg) |bgPtr| utils.f32PtrToRGBA(bgPtr) else null;
549
- bufferPtr.drawGrayscaleBuffer(posX, posY, intensities, srcWidth, srcHeight, rgbaFg, rgbaBg);
550
- }
551
-
552
- export fn bufferDrawGrayscaleBufferSupersampled(bufferPtr: *buffer.OptimizedBuffer, posX: i32, posY: i32, intensities: [*]const f32, srcWidth: u32, srcHeight: u32, fg: ?[*]const f32, bg: ?[*]const f32) void {
553
- const rgbaFg = if (fg) |fgPtr| utils.f32PtrToRGBA(fgPtr) else null;
554
- const rgbaBg = if (bg) |bgPtr| utils.f32PtrToRGBA(bgPtr) else null;
555
- bufferPtr.drawGrayscaleBufferSupersampled(posX, posY, intensities, srcWidth, srcHeight, rgbaFg, rgbaBg);
556
- }
557
-
558
- export fn bufferPushScissorRect(bufferPtr: *buffer.OptimizedBuffer, x: i32, y: i32, width: u32, height: u32) void {
559
- bufferPtr.pushScissorRect(x, y, width, height) catch {};
560
- }
561
-
562
- export fn bufferPopScissorRect(bufferPtr: *buffer.OptimizedBuffer) void {
563
- bufferPtr.popScissorRect();
564
- }
565
-
566
- export fn bufferClearScissorRects(bufferPtr: *buffer.OptimizedBuffer) void {
567
- bufferPtr.clearScissorRects();
568
- }
569
-
570
- // Opacity stack functions
571
- export fn bufferPushOpacity(bufferPtr: *buffer.OptimizedBuffer, opacity: f32) void {
572
- bufferPtr.pushOpacity(opacity) catch {};
573
- }
574
-
575
- export fn bufferPopOpacity(bufferPtr: *buffer.OptimizedBuffer) void {
576
- bufferPtr.popOpacity();
577
- }
578
-
579
- export fn bufferGetCurrentOpacity(bufferPtr: *buffer.OptimizedBuffer) f32 {
580
- return bufferPtr.getCurrentOpacity();
581
- }
582
-
583
- export fn bufferClearOpacity(bufferPtr: *buffer.OptimizedBuffer) void {
584
- bufferPtr.clearOpacity();
585
- }
586
-
587
- export fn bufferDrawSuperSampleBuffer(bufferPtr: *buffer.OptimizedBuffer, x: u32, y: u32, pixelData: [*]const u8, len: usize, format: u8, alignedBytesPerRow: u32) void {
588
- bufferPtr.drawSuperSampleBuffer(x, y, pixelData, len, format, alignedBytesPerRow) catch {};
589
- }
590
-
591
- export fn linkAlloc(urlPtr: [*]const u8, urlLen: usize) u32 {
592
- const url = urlPtr[0..urlLen];
593
- const link_pool = link.initGlobalLinkPool(globalArena);
594
- return link_pool.alloc(url) catch 0;
595
- }
596
-
597
- export fn linkGetUrl(id: u32, outPtr: [*]u8, maxLen: usize) usize {
598
- const link_pool = link.initGlobalLinkPool(globalArena);
599
- const url_bytes = link_pool.get(id) catch return 0;
600
- const copyLen = @min(url_bytes.len, maxLen);
601
- @memcpy(outPtr[0..copyLen], url_bytes[0..copyLen]);
602
- return copyLen;
603
- }
604
-
605
- export fn attributesWithLink(baseAttributes: u32, linkId: u32) u32 {
606
- return ansi.TextAttributes.setLinkId(baseAttributes, linkId);
607
- }
608
-
609
- export fn attributesGetLinkId(attributes: u32) u32 {
610
- return ansi.TextAttributes.getLinkId(attributes);
611
- }
612
-
613
- pub const ExternalGridDrawOptions = extern struct {
614
- draw_inner: bool,
615
- draw_outer: bool,
616
- };
617
-
618
- export fn bufferDrawGrid(
619
- bufferPtr: *buffer.OptimizedBuffer,
620
- borderChars: [*]const u32,
621
- borderFg: [*]const f32,
622
- borderBg: [*]const f32,
623
- columnOffsets: [*]const i32,
624
- columnCount: u32,
625
- rowOffsets: [*]const i32,
626
- rowCount: u32,
627
- options: *const ExternalGridDrawOptions,
628
- ) void {
629
- bufferPtr.drawGrid(
630
- borderChars,
631
- utils.f32PtrToRGBA(borderFg),
632
- utils.f32PtrToRGBA(borderBg),
633
- columnOffsets,
634
- columnCount,
635
- rowOffsets,
636
- rowCount,
637
- options.draw_inner,
638
- options.draw_outer,
639
- );
640
- }
641
-
642
- export fn bufferDrawBox(
643
- bufferPtr: *buffer.OptimizedBuffer,
644
- x: i32,
645
- y: i32,
646
- width: u32,
647
- height: u32,
648
- borderChars: [*]const u32,
649
- packedOptions: u32,
650
- borderColor: [*]const f32,
651
- backgroundColor: [*]const f32,
652
- title: ?[*]const u8,
653
- titleLen: u32,
654
- ) void {
655
- const borderSides = buffer.BorderSides{
656
- .top = (packedOptions & 0b1000) != 0,
657
- .right = (packedOptions & 0b0100) != 0,
658
- .bottom = (packedOptions & 0b0010) != 0,
659
- .left = (packedOptions & 0b0001) != 0,
660
- };
661
-
662
- const shouldFill = ((packedOptions >> 4) & 1) != 0;
663
- const titleAlignment = @as(u8, @intCast((packedOptions >> 5) & 0b11));
664
-
665
- const titleSlice = if (title) |t| t[0..titleLen] else null;
666
-
667
- bufferPtr.drawBox(
668
- x,
669
- y,
670
- width,
671
- height,
672
- borderChars,
673
- borderSides,
674
- utils.f32PtrToRGBA(borderColor),
675
- utils.f32PtrToRGBA(backgroundColor),
676
- shouldFill,
677
- titleSlice,
678
- titleAlignment,
679
- ) catch {};
680
- }
681
-
682
- export fn bufferResize(bufferPtr: *buffer.OptimizedBuffer, width: u32, height: u32) void {
683
- bufferPtr.resize(width, height) catch {};
684
- }
685
-
686
- export fn resizeRenderer(rendererPtr: *renderer.CliRenderer, width: u32, height: u32) void {
687
- rendererPtr.resize(width, height) catch {};
688
- }
689
-
690
- export fn addToHitGrid(rendererPtr: *renderer.CliRenderer, x: i32, y: i32, width: u32, height: u32, id: u32) void {
691
- rendererPtr.addToHitGrid(x, y, width, height, id);
692
- }
693
-
694
- export fn clearCurrentHitGrid(rendererPtr: *renderer.CliRenderer) void {
695
- rendererPtr.clearCurrentHitGrid();
696
- }
697
-
698
- export fn hitGridPushScissorRect(rendererPtr: *renderer.CliRenderer, x: i32, y: i32, width: u32, height: u32) void {
699
- rendererPtr.hitGridPushScissorRect(x, y, width, height);
700
- }
701
-
702
- export fn hitGridPopScissorRect(rendererPtr: *renderer.CliRenderer) void {
703
- rendererPtr.hitGridPopScissorRect();
704
- }
705
-
706
- export fn hitGridClearScissorRects(rendererPtr: *renderer.CliRenderer) void {
707
- rendererPtr.hitGridClearScissorRects();
708
- }
709
-
710
- export fn addToCurrentHitGridClipped(rendererPtr: *renderer.CliRenderer, x: i32, y: i32, width: u32, height: u32, id: u32) void {
711
- rendererPtr.addToCurrentHitGridClipped(x, y, width, height, id);
712
- }
713
-
714
- export fn checkHit(rendererPtr: *renderer.CliRenderer, x: u32, y: u32) u32 {
715
- return rendererPtr.checkHit(x, y);
716
- }
717
-
718
- export fn getHitGridDirty(rendererPtr: *renderer.CliRenderer) bool {
719
- return rendererPtr.getHitGridDirty();
720
- }
721
-
722
- export fn dumpHitGrid(rendererPtr: *renderer.CliRenderer) void {
723
- rendererPtr.dumpHitGrid();
724
- }
725
-
726
- export fn dumpBuffers(rendererPtr: *renderer.CliRenderer, timestamp: i64) void {
727
- rendererPtr.dumpBuffers(timestamp);
728
- }
729
-
730
- export fn dumpStdoutBuffer(rendererPtr: *renderer.CliRenderer, timestamp: i64) void {
731
- rendererPtr.dumpStdoutBuffer(timestamp);
732
- }
733
-
734
- export fn restoreTerminalModes(rendererPtr: *renderer.CliRenderer) void {
735
- rendererPtr.restoreTerminalModes();
736
- }
737
-
738
- export fn enableMouse(rendererPtr: *renderer.CliRenderer, enableMovement: bool) void {
739
- rendererPtr.enableMouse(enableMovement);
740
- }
741
-
742
- export fn disableMouse(rendererPtr: *renderer.CliRenderer) void {
743
- rendererPtr.disableMouse();
744
- }
745
-
746
- export fn queryPixelResolution(rendererPtr: *renderer.CliRenderer) void {
747
- rendererPtr.queryPixelResolution();
748
- }
749
-
750
- export fn enableKittyKeyboard(rendererPtr: *renderer.CliRenderer, flags: u8) void {
751
- rendererPtr.enableKittyKeyboard(flags);
752
- }
753
-
754
- export fn disableKittyKeyboard(rendererPtr: *renderer.CliRenderer) void {
755
- rendererPtr.disableKittyKeyboard();
756
- }
757
-
758
- export fn setKittyKeyboardFlags(rendererPtr: *renderer.CliRenderer, flags: u8) void {
759
- rendererPtr.setKittyKeyboardFlags(flags);
760
- }
761
-
762
- export fn getKittyKeyboardFlags(rendererPtr: *renderer.CliRenderer) u8 {
763
- return rendererPtr.getKittyKeyboardFlags();
764
- }
765
-
766
- export fn setupTerminal(rendererPtr: *renderer.CliRenderer, useAlternateScreen: bool) void {
767
- rendererPtr.setupTerminal(useAlternateScreen);
768
- }
769
-
770
- export fn suspendRenderer(rendererPtr: *renderer.CliRenderer) void {
771
- rendererPtr.suspendRenderer();
772
- }
773
-
774
- export fn resumeRenderer(rendererPtr: *renderer.CliRenderer) void {
775
- rendererPtr.resumeRenderer();
776
- }
777
-
778
- export fn writeOut(rendererPtr: *renderer.CliRenderer, dataPtr: [*]const u8, dataLen: usize) void {
779
- if (dataLen == 0) return;
780
- const data = dataPtr[0..dataLen];
781
- rendererPtr.writeOut(data);
782
- }
783
-
784
- export fn createTextBuffer(widthMethod: u8) ?*text_buffer.UnifiedTextBuffer {
785
- const pool = gp.initGlobalPool(globalArena);
786
- const link_pool = link.initGlobalLinkPool(globalArena);
787
- const wMethod: utf8.WidthMethod = if (widthMethod == 0) .wcwidth else .unicode;
788
-
789
- return text_buffer.UnifiedTextBuffer.init(globalAllocator, pool, link_pool, wMethod) catch {
790
- return null;
791
- };
792
- }
793
-
794
- export fn destroyTextBuffer(tb: *text_buffer.UnifiedTextBuffer) void {
795
- tb.deinit();
796
- }
797
-
798
- export fn textBufferGetLength(tb: *text_buffer.UnifiedTextBuffer) u32 {
799
- return tb.getLength();
800
- }
801
-
802
- export fn textBufferGetByteSize(tb: *text_buffer.UnifiedTextBuffer) u32 {
803
- return tb.getByteSize();
804
- }
805
-
806
- export fn textBufferReset(tb: *text_buffer.UnifiedTextBuffer) void {
807
- tb.reset();
808
- }
809
-
810
- export fn textBufferClear(tb: *text_buffer.UnifiedTextBuffer) void {
811
- tb.clear();
812
- }
813
-
814
- export fn textBufferSetDefaultFg(tb: *text_buffer.UnifiedTextBuffer, fg: ?[*]const f32) void {
815
- const fgColor = if (fg) |fgPtr| utils.f32PtrToRGBA(fgPtr) else null;
816
- tb.setDefaultFg(fgColor);
817
- }
818
-
819
- export fn textBufferSetDefaultBg(tb: *text_buffer.UnifiedTextBuffer, bg: ?[*]const f32) void {
820
- const bgColor = if (bg) |bgPtr| utils.f32PtrToRGBA(bgPtr) else null;
821
- tb.setDefaultBg(bgColor);
822
- }
823
-
824
- export fn textBufferSetDefaultAttributes(tb: *text_buffer.UnifiedTextBuffer, attr: ?[*]const u32) void {
825
- const attributes = if (attr) |a| a[0] else null;
826
- tb.setDefaultAttributes(attributes);
827
- }
828
-
829
- export fn textBufferResetDefaults(tb: *text_buffer.UnifiedTextBuffer) void {
830
- tb.resetDefaults();
831
- }
832
-
833
- export fn textBufferGetTabWidth(tb: *text_buffer.UnifiedTextBuffer) u8 {
834
- return tb.tabWidth();
835
- }
836
-
837
- export fn textBufferSetTabWidth(tb: *text_buffer.UnifiedTextBuffer, width: u8) void {
838
- tb.setTabWidth(width);
839
- }
840
-
841
- export fn textBufferRegisterMemBuffer(tb: *text_buffer.UnifiedTextBuffer, dataPtr: [*]const u8, dataLen: usize, owned: bool) u16 {
842
- const data = dataPtr[0..dataLen];
843
- const mem_id = tb.registerMemBuffer(data, owned) catch return 0xFFFF;
844
- return @intCast(mem_id);
845
- }
846
-
847
- export fn textBufferReplaceMemBuffer(tb: *text_buffer.UnifiedTextBuffer, id: u8, dataPtr: [*]const u8, dataLen: usize, owned: bool) bool {
848
- const data = dataPtr[0..dataLen];
849
- tb.replaceMemBuffer(id, data, owned) catch return false;
850
- return true;
851
- }
852
-
853
- export fn textBufferClearMemRegistry(tb: *text_buffer.UnifiedTextBuffer) void {
854
- tb.clearMemRegistry();
855
- }
856
-
857
- export fn textBufferSetTextFromMem(tb: *text_buffer.UnifiedTextBuffer, id: u8) void {
858
- tb.setTextFromMemId(id) catch {};
859
- }
860
-
861
- export fn textBufferAppend(tb: *text_buffer.UnifiedTextBuffer, dataPtr: [*]const u8, dataLen: usize) void {
862
- const data = dataPtr[0..dataLen];
863
- tb.append(data) catch {};
864
- }
865
-
866
- export fn textBufferAppendFromMemId(tb: *text_buffer.UnifiedTextBuffer, id: u8) void {
867
- tb.appendFromMemId(id) catch {};
868
- }
869
-
870
- export fn textBufferLoadFile(tb: *text_buffer.UnifiedTextBuffer, pathPtr: [*]const u8, pathLen: usize) bool {
871
- const path = pathPtr[0..pathLen];
872
- tb.loadFile(path) catch return false;
873
- return true;
874
- }
875
-
876
- export fn textBufferSetStyledText(
877
- tb: *text_buffer.UnifiedTextBuffer,
878
- chunksPtr: [*]const text_buffer.StyledChunk,
879
- chunkCount: usize,
880
- ) void {
881
- if (chunkCount == 0) return;
882
- const chunks = chunksPtr[0..chunkCount];
883
- tb.setStyledText(chunks) catch {};
884
- }
885
-
886
- export fn textBufferGetLineCount(tb: *text_buffer.UnifiedTextBuffer) u32 {
887
- return tb.getLineCount();
888
- }
889
-
890
- export fn textBufferGetPlainText(tb: *text_buffer.UnifiedTextBuffer, outPtr: [*]u8, maxLen: usize) usize {
891
- const outBuffer = outPtr[0..maxLen];
892
- return tb.getPlainTextIntoBuffer(outBuffer);
893
- }
894
-
895
- // TextBufferView functions (Array-based for backward compatibility)
896
- export fn createTextBufferView(tb: *text_buffer.UnifiedTextBuffer) ?*text_buffer_view.UnifiedTextBufferView {
897
- return text_buffer_view.UnifiedTextBufferView.init(globalAllocator, tb) catch {
898
- return null;
899
- };
900
- }
901
-
902
- export fn destroyTextBufferView(view: *text_buffer_view.UnifiedTextBufferView) void {
903
- view.deinit();
904
- }
905
-
906
- export fn textBufferViewSetSelection(view: *text_buffer_view.UnifiedTextBufferView, start: u32, end: u32, bgColor: ?[*]const f32, fgColor: ?[*]const f32) void {
907
- const bg = if (bgColor) |bgPtr| utils.f32PtrToRGBA(bgPtr) else null;
908
- const fg = if (fgColor) |fgPtr| utils.f32PtrToRGBA(fgPtr) else null;
909
- view.setSelection(start, end, bg, fg);
910
- }
911
-
912
- export fn textBufferViewResetSelection(view: *text_buffer_view.UnifiedTextBufferView) void {
913
- view.resetSelection();
914
- }
915
-
916
- export fn textBufferViewGetSelectionInfo(view: *text_buffer_view.UnifiedTextBufferView) u64 {
917
- return view.packSelectionInfo();
918
- }
919
-
920
- export fn textBufferViewSetLocalSelection(view: *text_buffer_view.UnifiedTextBufferView, anchorX: i32, anchorY: i32, focusX: i32, focusY: i32, bgColor: ?[*]const f32, fgColor: ?[*]const f32) bool {
921
- const bg = if (bgColor) |bgPtr| utils.f32PtrToRGBA(bgPtr) else null;
922
- const fg = if (fgColor) |fgPtr| utils.f32PtrToRGBA(fgPtr) else null;
923
- return view.setLocalSelection(anchorX, anchorY, focusX, focusY, bg, fg);
924
- }
925
-
926
- export fn textBufferViewUpdateSelection(view: *text_buffer_view.UnifiedTextBufferView, end: u32, bgColor: ?[*]const f32, fgColor: ?[*]const f32) void {
927
- const bg = if (bgColor) |bgPtr| utils.f32PtrToRGBA(bgPtr) else null;
928
- const fg = if (fgColor) |fgPtr| utils.f32PtrToRGBA(fgPtr) else null;
929
- view.updateSelection(end, bg, fg);
930
- }
931
-
932
- export fn textBufferViewUpdateLocalSelection(view: *text_buffer_view.UnifiedTextBufferView, anchorX: i32, anchorY: i32, focusX: i32, focusY: i32, bgColor: ?[*]const f32, fgColor: ?[*]const f32) bool {
933
- const bg = if (bgColor) |bgPtr| utils.f32PtrToRGBA(bgPtr) else null;
934
- const fg = if (fgColor) |fgPtr| utils.f32PtrToRGBA(fgPtr) else null;
935
- return view.updateLocalSelection(anchorX, anchorY, focusX, focusY, bg, fg);
936
- }
937
-
938
- export fn textBufferViewResetLocalSelection(view: *text_buffer_view.UnifiedTextBufferView) void {
939
- view.resetLocalSelection();
940
- }
941
-
942
- export fn textBufferViewSetWrapWidth(view: *text_buffer_view.UnifiedTextBufferView, width: u32) void {
943
- view.setWrapWidth(if (width == 0) null else width);
944
- }
945
-
946
- export fn textBufferViewSetWrapMode(view: *text_buffer_view.UnifiedTextBufferView, mode: u8) void {
947
- const wrapMode: text_buffer.WrapMode = switch (mode) {
948
- 0 => .none,
949
- 1 => .char,
950
- 2 => .word,
951
- else => .none,
952
- };
953
- view.setWrapMode(wrapMode);
954
- }
955
-
956
- export fn textBufferViewSetViewportSize(view: *text_buffer_view.UnifiedTextBufferView, width: u32, height: u32) void {
957
- view.setViewportSize(width, height);
958
- }
959
-
960
- export fn textBufferViewSetViewport(view: *text_buffer_view.UnifiedTextBufferView, x: u32, y: u32, width: u32, height: u32) void {
961
- view.setViewport(text_buffer_view.Viewport{
962
- .x = x,
963
- .y = y,
964
- .width = width,
965
- .height = height,
966
- });
967
- }
968
-
969
- export fn textBufferViewGetVirtualLineCount(view: *text_buffer_view.UnifiedTextBufferView) u32 {
970
- return view.getVirtualLineCount();
971
- }
972
-
973
- export fn textBufferViewGetLineInfoDirect(view: *text_buffer_view.UnifiedTextBufferView, outPtr: *ExternalLineInfo) void {
974
- const line_info = view.getCachedLineInfo();
975
-
976
- outPtr.* = .{
977
- .start_cols_ptr = line_info.line_start_cols.ptr,
978
- .start_cols_len = @intCast(line_info.line_start_cols.len),
979
- .width_cols_ptr = line_info.line_width_cols.ptr,
980
- .width_cols_len = @intCast(line_info.line_width_cols.len),
981
- .sources_ptr = line_info.line_sources.ptr,
982
- .sources_len = @intCast(line_info.line_sources.len),
983
- .wraps_ptr = line_info.line_wraps.ptr,
984
- .wraps_len = @intCast(line_info.line_wraps.len),
985
- .width_cols_max = line_info.line_width_cols_max,
986
- };
987
- }
988
-
989
- export fn textBufferViewGetLogicalLineInfoDirect(view: *text_buffer_view.UnifiedTextBufferView, outPtr: *ExternalLineInfo) void {
990
- const line_info = view.getLogicalLineInfo();
991
-
992
- outPtr.* = .{
993
- .start_cols_ptr = line_info.line_start_cols.ptr,
994
- .start_cols_len = @intCast(line_info.line_start_cols.len),
995
- .width_cols_ptr = line_info.line_width_cols.ptr,
996
- .width_cols_len = @intCast(line_info.line_width_cols.len),
997
- .sources_ptr = line_info.line_sources.ptr,
998
- .sources_len = @intCast(line_info.line_sources.len),
999
- .wraps_ptr = line_info.line_wraps.ptr,
1000
- .wraps_len = @intCast(line_info.line_wraps.len),
1001
- .width_cols_max = line_info.line_width_cols_max,
1002
- };
1003
- }
1004
-
1005
- export fn textBufferViewGetSelectedText(view: *text_buffer_view.UnifiedTextBufferView, outPtr: [*]u8, maxLen: usize) usize {
1006
- const outBuffer = outPtr[0..maxLen];
1007
- return view.getSelectedTextIntoBuffer(outBuffer);
1008
- }
1009
-
1010
- export fn textBufferViewGetPlainText(view: *text_buffer_view.UnifiedTextBufferView, outPtr: [*]u8, maxLen: usize) usize {
1011
- const outBuffer = outPtr[0..maxLen];
1012
- return view.getPlainTextIntoBuffer(outBuffer);
1013
- }
1014
-
1015
- export fn textBufferViewSetTabIndicator(view: *text_buffer_view.UnifiedTextBufferView, indicator: u32) void {
1016
- view.setTabIndicator(indicator);
1017
- }
1018
-
1019
- export fn textBufferViewSetTabIndicatorColor(view: *text_buffer_view.UnifiedTextBufferView, color: [*]const f32) void {
1020
- view.setTabIndicatorColor(utils.f32PtrToRGBA(color));
1021
- }
1022
-
1023
- export fn textBufferViewSetTruncate(view: *text_buffer_view.UnifiedTextBufferView, truncate: bool) void {
1024
- view.setTruncate(truncate);
1025
- }
1026
-
1027
- pub const ExternalMeasureResult = extern struct {
1028
- line_count: u32,
1029
- width_cols_max: u32,
1030
- };
1031
-
1032
- export fn textBufferViewMeasureForDimensions(view: *text_buffer_view.UnifiedTextBufferView, width: u32, height: u32, outPtr: *ExternalMeasureResult) bool {
1033
- const result = view.measureForDimensions(width, height) catch return false;
1034
- outPtr.* = .{
1035
- .line_count = result.line_count,
1036
- .width_cols_max = result.width_cols_max,
1037
- };
1038
- return true;
1039
- }
1040
-
1041
- // ===== EditBuffer Exports =====
1042
-
1043
- export fn createEditBuffer(widthMethod: u8) ?*edit_buffer_mod.EditBuffer {
1044
- const pool = gp.initGlobalPool(globalArena);
1045
- const link_pool = link.initGlobalLinkPool(globalArena);
1046
- const wMethod: utf8.WidthMethod = if (widthMethod == 0) .wcwidth else .unicode;
1047
-
1048
- return edit_buffer_mod.EditBuffer.init(
1049
- globalAllocator,
1050
- pool,
1051
- link_pool,
1052
- wMethod,
1053
- ) catch null;
1054
- }
1055
-
1056
- export fn destroyEditBuffer(edit_buffer: *edit_buffer_mod.EditBuffer) void {
1057
- edit_buffer.deinit();
1058
- }
1059
-
1060
- export fn editBufferGetTextBuffer(edit_buffer: *edit_buffer_mod.EditBuffer) *text_buffer.UnifiedTextBuffer {
1061
- return edit_buffer.getTextBuffer();
1062
- }
1063
-
1064
- export fn editBufferInsertText(edit_buffer: *edit_buffer_mod.EditBuffer, textPtr: [*]const u8, textLen: usize) void {
1065
- const text = textPtr[0..textLen];
1066
- edit_buffer.insertText(text) catch {};
1067
- }
1068
-
1069
- export fn editBufferDeleteRange(edit_buffer: *edit_buffer_mod.EditBuffer, start_row: u32, start_col: u32, end_row: u32, end_col: u32) void {
1070
- const start = edit_buffer_mod.Cursor{ .row = start_row, .col = start_col };
1071
- const end = edit_buffer_mod.Cursor{ .row = end_row, .col = end_col };
1072
- edit_buffer.deleteRange(start, end) catch {};
1073
- }
1074
-
1075
- export fn editBufferDeleteCharBackward(edit_buffer: *edit_buffer_mod.EditBuffer) void {
1076
- edit_buffer.backspace() catch {};
1077
- }
1078
-
1079
- export fn editBufferDeleteChar(edit_buffer: *edit_buffer_mod.EditBuffer) void {
1080
- edit_buffer.deleteForward() catch {};
1081
- }
1082
-
1083
- export fn editBufferMoveCursorLeft(edit_buffer: *edit_buffer_mod.EditBuffer) void {
1084
- edit_buffer.moveLeft();
1085
- }
1086
-
1087
- export fn editBufferMoveCursorRight(edit_buffer: *edit_buffer_mod.EditBuffer) void {
1088
- edit_buffer.moveRight();
1089
- }
1090
-
1091
- export fn editBufferMoveCursorUp(edit_buffer: *edit_buffer_mod.EditBuffer) void {
1092
- edit_buffer.moveUp();
1093
- }
1094
-
1095
- export fn editBufferMoveCursorDown(edit_buffer: *edit_buffer_mod.EditBuffer) void {
1096
- edit_buffer.moveDown();
1097
- }
1098
-
1099
- export fn editBufferGetCursor(edit_buffer: *edit_buffer_mod.EditBuffer, outRow: *u32, outCol: *u32) void {
1100
- const cursor = edit_buffer.getPrimaryCursor();
1101
- outRow.* = cursor.row;
1102
- outCol.* = cursor.col;
1103
- }
1104
-
1105
- export fn editBufferSetCursor(edit_buffer: *edit_buffer_mod.EditBuffer, row: u32, col: u32) void {
1106
- edit_buffer.setCursor(row, col) catch {};
1107
- }
1108
-
1109
- export fn editBufferSetCursorToLineCol(edit_buffer: *edit_buffer_mod.EditBuffer, row: u32, col: u32) void {
1110
- edit_buffer.setCursor(row, col) catch {};
1111
- }
1112
-
1113
- export fn editBufferSetCursorByOffset(edit_buffer: *edit_buffer_mod.EditBuffer, offset: u32) void {
1114
- edit_buffer.setCursorByOffset(offset) catch {};
1115
- }
1116
-
1117
- export fn editBufferGetNextWordBoundary(edit_buffer: *edit_buffer_mod.EditBuffer, outPtr: *ExternalLogicalCursor) void {
1118
- const cursor = edit_buffer.getNextWordBoundary();
1119
- outPtr.* = .{
1120
- .row = cursor.row,
1121
- .col = cursor.col,
1122
- .offset = cursor.offset,
1123
- };
1124
- }
1125
-
1126
- export fn editBufferGetPrevWordBoundary(edit_buffer: *edit_buffer_mod.EditBuffer, outPtr: *ExternalLogicalCursor) void {
1127
- const cursor = edit_buffer.getPrevWordBoundary();
1128
- outPtr.* = .{
1129
- .row = cursor.row,
1130
- .col = cursor.col,
1131
- .offset = cursor.offset,
1132
- };
1133
- }
1134
-
1135
- export fn editBufferGetEOL(edit_buffer: *edit_buffer_mod.EditBuffer, outPtr: *ExternalLogicalCursor) void {
1136
- const cursor = edit_buffer.getEOL();
1137
- outPtr.* = .{
1138
- .row = cursor.row,
1139
- .col = cursor.col,
1140
- .offset = cursor.offset,
1141
- };
1142
- }
1143
-
1144
- export fn editBufferOffsetToPosition(edit_buffer: *edit_buffer_mod.EditBuffer, offset: u32, outPtr: *ExternalLogicalCursor) bool {
1145
- const iter_mod = @import("text-buffer-iterators.zig");
1146
- const coords = iter_mod.offsetToCoords(edit_buffer.tb.rope(), offset) orelse return false;
1147
- outPtr.* = .{
1148
- .row = coords.row,
1149
- .col = coords.col,
1150
- .offset = offset,
1151
- };
1152
- return true;
1153
- }
1154
-
1155
- export fn editBufferPositionToOffset(edit_buffer: *edit_buffer_mod.EditBuffer, row: u32, col: u32) u32 {
1156
- const iter_mod = @import("text-buffer-iterators.zig");
1157
- return iter_mod.coordsToOffset(edit_buffer.tb.rope(), row, col) orelse 0;
1158
- }
1159
-
1160
- export fn editBufferGetLineStartOffset(edit_buffer: *edit_buffer_mod.EditBuffer, row: u32) u32 {
1161
- const iter_mod = @import("text-buffer-iterators.zig");
1162
- return iter_mod.coordsToOffset(edit_buffer.tb.rope(), row, 0) orelse 0;
1163
- }
1164
-
1165
- export fn editBufferGetTextRange(edit_buffer: *edit_buffer_mod.EditBuffer, start_offset: u32, end_offset: u32, outPtr: [*]u8, maxLen: usize) usize {
1166
- const outBuffer = outPtr[0..maxLen];
1167
- return edit_buffer.getTextRange(start_offset, end_offset, outBuffer) catch 0;
1168
- }
1169
-
1170
- export fn editBufferGetTextRangeByCoords(edit_buffer: *edit_buffer_mod.EditBuffer, start_row: u32, start_col: u32, end_row: u32, end_col: u32, outPtr: [*]u8, maxLen: usize) usize {
1171
- const outBuffer = outPtr[0..maxLen];
1172
- return edit_buffer.getTextRangeByCoords(start_row, start_col, end_row, end_col, outBuffer);
1173
- }
1174
-
1175
- export fn editBufferSetText(edit_buffer: *edit_buffer_mod.EditBuffer, textPtr: [*]const u8, textLen: usize) void {
1176
- const text = textPtr[0..textLen];
1177
- edit_buffer.setText(text) catch {};
1178
- }
1179
-
1180
- export fn editBufferSetTextFromMem(edit_buffer: *edit_buffer_mod.EditBuffer, mem_id: u8) void {
1181
- edit_buffer.setTextFromMemId(mem_id) catch {};
1182
- }
1183
-
1184
- export fn editBufferReplaceText(edit_buffer: *edit_buffer_mod.EditBuffer, textPtr: [*]const u8, textLen: usize) void {
1185
- const text = textPtr[0..textLen];
1186
- edit_buffer.replaceText(text) catch {};
1187
- }
1188
-
1189
- export fn editBufferReplaceTextFromMem(edit_buffer: *edit_buffer_mod.EditBuffer, mem_id: u8) void {
1190
- edit_buffer.replaceTextFromMemId(mem_id) catch {};
1191
- }
1192
-
1193
- export fn editBufferGetText(edit_buffer: *edit_buffer_mod.EditBuffer, outPtr: [*]u8, maxLen: usize) usize {
1194
- const outBuffer = outPtr[0..maxLen];
1195
- return edit_buffer.getText(outBuffer);
1196
- }
1197
-
1198
- export fn editBufferInsertChar(edit_buffer: *edit_buffer_mod.EditBuffer, charPtr: [*]const u8, charLen: usize) void {
1199
- const text = charPtr[0..charLen];
1200
- edit_buffer.insertText(text) catch {};
1201
- }
1202
-
1203
- export fn editBufferNewLine(edit_buffer: *edit_buffer_mod.EditBuffer) void {
1204
- edit_buffer.insertText("\n") catch {};
1205
- }
1206
-
1207
- export fn editBufferDeleteLine(edit_buffer: *edit_buffer_mod.EditBuffer) void {
1208
- edit_buffer.deleteLine() catch {};
1209
- }
1210
-
1211
- export fn editBufferGotoLine(edit_buffer: *edit_buffer_mod.EditBuffer, line: u32) void {
1212
- edit_buffer.gotoLine(line) catch {};
1213
- }
1214
-
1215
- export fn editBufferGetCursorPosition(edit_buffer: *edit_buffer_mod.EditBuffer, outPtr: *ExternalLogicalCursor) void {
1216
- const pos = edit_buffer.getCursorPosition();
1217
- outPtr.* = .{
1218
- .row = pos.line,
1219
- .col = pos.visual_col,
1220
- .offset = pos.offset,
1221
- };
1222
- }
1223
-
1224
- export fn editBufferGetId(edit_buffer: *edit_buffer_mod.EditBuffer) u16 {
1225
- return edit_buffer.getId();
1226
- }
1227
-
1228
- export fn editBufferDebugLogRope(edit_buffer: *edit_buffer_mod.EditBuffer) void {
1229
- edit_buffer.debugLogRope();
1230
- }
1231
-
1232
- export fn editBufferUndo(edit_buffer: *edit_buffer_mod.EditBuffer, outPtr: [*]u8, maxLen: usize) usize {
1233
- const prev_meta = edit_buffer.undo() catch return 0;
1234
- const copyLen = @min(prev_meta.len, maxLen);
1235
- @memcpy(outPtr[0..copyLen], prev_meta[0..copyLen]);
1236
- return copyLen;
1237
- }
1238
-
1239
- export fn editBufferRedo(edit_buffer: *edit_buffer_mod.EditBuffer, outPtr: [*]u8, maxLen: usize) usize {
1240
- const next_meta = edit_buffer.redo() catch return 0;
1241
- const copyLen = @min(next_meta.len, maxLen);
1242
- @memcpy(outPtr[0..copyLen], next_meta[0..copyLen]);
1243
- return copyLen;
1244
- }
1245
-
1246
- export fn editBufferCanUndo(edit_buffer: *edit_buffer_mod.EditBuffer) bool {
1247
- return edit_buffer.canUndo();
1248
- }
1249
-
1250
- export fn editBufferCanRedo(edit_buffer: *edit_buffer_mod.EditBuffer) bool {
1251
- return edit_buffer.canRedo();
1252
- }
1253
-
1254
- export fn editBufferClearHistory(edit_buffer: *edit_buffer_mod.EditBuffer) void {
1255
- edit_buffer.clearHistory();
1256
- }
1257
-
1258
- export fn editBufferClear(edit_buffer: *edit_buffer_mod.EditBuffer) void {
1259
- edit_buffer.clear() catch {};
1260
- }
1261
-
1262
- // ===== EditorView Exports =====
1263
-
1264
- export fn createEditorView(edit_buffer: *edit_buffer_mod.EditBuffer, viewport_width: u32, viewport_height: u32) ?*editor_view.EditorView {
1265
- return editor_view.EditorView.init(globalArena, edit_buffer, viewport_width, viewport_height) catch null;
1266
- }
1267
-
1268
- export fn destroyEditorView(view: *editor_view.EditorView) void {
1269
- view.deinit();
1270
- }
1271
-
1272
- export fn editorViewSetViewport(view: *editor_view.EditorView, x: u32, y: u32, width: u32, height: u32, moveCursor: bool) void {
1273
- view.setViewport(text_buffer_view.Viewport{ .x = x, .y = y, .width = width, .height = height }, moveCursor);
1274
- }
1275
-
1276
- export fn editorViewClearViewport(view: *editor_view.EditorView) void {
1277
- view.setViewport(null, false);
1278
- }
1279
-
1280
- export fn editorViewGetViewport(view: *editor_view.EditorView, outX: *u32, outY: *u32, outWidth: *u32, outHeight: *u32) bool {
1281
- if (view.getViewport()) |vp| {
1282
- outX.* = vp.x;
1283
- outY.* = vp.y;
1284
- outWidth.* = vp.width;
1285
- outHeight.* = vp.height;
1286
- return true;
1287
- }
1288
- return false;
1289
- }
1290
-
1291
- export fn editorViewSetScrollMargin(view: *editor_view.EditorView, margin: f32) void {
1292
- view.setScrollMargin(margin);
1293
- }
1294
-
1295
- export fn editorViewGetVirtualLineCount(view: *editor_view.EditorView) u32 {
1296
- // TODO: There is a getter for that directly, no?
1297
- return @intCast(view.getVirtualLines().len);
1298
- }
1299
-
1300
- export fn editorViewGetTotalVirtualLineCount(view: *editor_view.EditorView) u32 {
1301
- return view.getTotalVirtualLineCount();
1302
- }
1303
-
1304
- export fn editorViewGetLineInfoDirect(view: *editor_view.EditorView, outPtr: *ExternalLineInfo) void {
1305
- const line_info = view.getCachedLineInfo();
1306
- outPtr.* = .{
1307
- .start_cols_ptr = line_info.line_start_cols.ptr,
1308
- .start_cols_len = @intCast(line_info.line_start_cols.len),
1309
- .width_cols_ptr = line_info.line_width_cols.ptr,
1310
- .width_cols_len = @intCast(line_info.line_width_cols.len),
1311
- .sources_ptr = line_info.line_sources.ptr,
1312
- .sources_len = @intCast(line_info.line_sources.len),
1313
- .wraps_ptr = line_info.line_wraps.ptr,
1314
- .wraps_len = @intCast(line_info.line_wraps.len),
1315
- .width_cols_max = line_info.line_width_cols_max,
1316
- };
1317
- }
1318
-
1319
- export fn editorViewGetTextBufferView(view: *editor_view.EditorView) *text_buffer_view.UnifiedTextBufferView {
1320
- return view.getTextBufferView();
1321
- }
1322
-
1323
- export fn editorViewGetLogicalLineInfoDirect(view: *editor_view.EditorView, outPtr: *ExternalLineInfo) void {
1324
- const line_info = view.getLogicalLineInfo();
1325
- outPtr.* = .{
1326
- .start_cols_ptr = line_info.line_start_cols.ptr,
1327
- .start_cols_len = @intCast(line_info.line_start_cols.len),
1328
- .width_cols_ptr = line_info.line_width_cols.ptr,
1329
- .width_cols_len = @intCast(line_info.line_width_cols.len),
1330
- .sources_ptr = line_info.line_sources.ptr,
1331
- .sources_len = @intCast(line_info.line_sources.len),
1332
- .wraps_ptr = line_info.line_wraps.ptr,
1333
- .wraps_len = @intCast(line_info.line_wraps.len),
1334
- .width_cols_max = line_info.line_width_cols_max,
1335
- };
1336
- }
1337
-
1338
- export fn editorViewSetViewportSize(view: *editor_view.EditorView, width: u32, height: u32) void {
1339
- view.setViewportSize(width, height);
1340
- }
1341
-
1342
- export fn editorViewSetWrapMode(view: *editor_view.EditorView, mode: u8) void {
1343
- const wrapMode: text_buffer.WrapMode = switch (mode) {
1344
- 0 => .none,
1345
- 1 => .char,
1346
- 2 => .word,
1347
- else => .none,
1348
- };
1349
- view.setWrapMode(wrapMode);
1350
- }
1351
-
1352
- // EditorView selection methods - delegate to TextBufferView
1353
- export fn editorViewSetSelection(view: *editor_view.EditorView, start: u32, end: u32, bgColor: ?[*]const f32, fgColor: ?[*]const f32) void {
1354
- const bg = if (bgColor) |bgPtr| utils.f32PtrToRGBA(bgPtr) else null;
1355
- const fg = if (fgColor) |fgPtr| utils.f32PtrToRGBA(fgPtr) else null;
1356
- view.text_buffer_view.setSelection(start, end, bg, fg);
1357
- }
1358
-
1359
- export fn editorViewResetSelection(view: *editor_view.EditorView) void {
1360
- view.text_buffer_view.resetSelection();
1361
- }
1362
-
1363
- export fn editorViewGetSelection(view: *editor_view.EditorView) u64 {
1364
- return view.text_buffer_view.packSelectionInfo();
1365
- }
1366
-
1367
- export fn editorViewSetLocalSelection(view: *editor_view.EditorView, anchorX: i32, anchorY: i32, focusX: i32, focusY: i32, bgColor: ?[*]const f32, fgColor: ?[*]const f32, updateCursor: bool, followCursor: bool) bool {
1368
- const bg = if (bgColor) |bgPtr| utils.f32PtrToRGBA(bgPtr) else null;
1369
- const fg = if (fgColor) |fgPtr| utils.f32PtrToRGBA(fgPtr) else null;
1370
- view.setSelectionFollowCursor(followCursor);
1371
- return view.setLocalSelection(anchorX, anchorY, focusX, focusY, bg, fg, updateCursor);
1372
- }
1373
-
1374
- export fn editorViewUpdateSelection(view: *editor_view.EditorView, end: u32, bgColor: ?[*]const f32, fgColor: ?[*]const f32) void {
1375
- const bg = if (bgColor) |bgPtr| utils.f32PtrToRGBA(bgPtr) else null;
1376
- const fg = if (fgColor) |fgPtr| utils.f32PtrToRGBA(fgPtr) else null;
1377
- view.updateSelection(end, bg, fg);
1378
- }
1379
-
1380
- export fn editorViewUpdateLocalSelection(view: *editor_view.EditorView, anchorX: i32, anchorY: i32, focusX: i32, focusY: i32, bgColor: ?[*]const f32, fgColor: ?[*]const f32, updateCursor: bool, followCursor: bool) bool {
1381
- const bg = if (bgColor) |bgPtr| utils.f32PtrToRGBA(bgPtr) else null;
1382
- const fg = if (fgColor) |fgPtr| utils.f32PtrToRGBA(fgPtr) else null;
1383
- view.setSelectionFollowCursor(followCursor);
1384
- return view.updateLocalSelection(anchorX, anchorY, focusX, focusY, bg, fg, updateCursor);
1385
- }
1386
-
1387
- export fn editorViewResetLocalSelection(view: *editor_view.EditorView) void {
1388
- view.setSelectionFollowCursor(false);
1389
- view.text_buffer_view.resetLocalSelection();
1390
- }
1391
-
1392
- export fn editorViewGetSelectedTextBytes(view: *editor_view.EditorView, outPtr: [*]u8, maxLen: usize) usize {
1393
- const outBuffer = outPtr[0..maxLen];
1394
- return view.text_buffer_view.getSelectedTextIntoBuffer(outBuffer);
1395
- }
1396
-
1397
- // EditorView cursor and text methods
1398
- export fn editorViewGetCursor(view: *editor_view.EditorView, outRow: *u32, outCol: *u32) void {
1399
- const cursor = view.getPrimaryCursor();
1400
- outRow.* = cursor.row;
1401
- outCol.* = cursor.col;
1402
- }
1403
-
1404
- export fn editorViewGetText(view: *editor_view.EditorView, outPtr: [*]u8, maxLen: usize) usize {
1405
- const outBuffer = outPtr[0..maxLen];
1406
- return view.getText(outBuffer);
1407
- }
1408
-
1409
- // ===== EditorView VisualCursor Exports =====
1410
-
1411
- export fn editorViewGetVisualCursor(view: *editor_view.EditorView, outPtr: *ExternalVisualCursor) void {
1412
- const vcursor = view.getVisualCursor();
1413
- outPtr.* = .{
1414
- .visual_row = vcursor.visual_row,
1415
- .visual_col = vcursor.visual_col,
1416
- .logical_row = vcursor.logical_row,
1417
- .logical_col = vcursor.logical_col,
1418
- .offset = vcursor.offset,
1419
- };
1420
- }
1421
-
1422
- export fn editorViewMoveUpVisual(view: *editor_view.EditorView) void {
1423
- view.moveUpVisual();
1424
- }
1425
-
1426
- export fn editorViewMoveDownVisual(view: *editor_view.EditorView) void {
1427
- view.moveDownVisual();
1428
- }
1429
-
1430
- export fn editorViewDeleteSelectedText(view: *editor_view.EditorView) void {
1431
- view.deleteSelectedText() catch {};
1432
- }
1433
-
1434
- export fn editorViewSetCursorByOffset(view: *editor_view.EditorView, offset: u32) void {
1435
- view.setCursorByOffset(offset) catch {};
1436
- }
1437
-
1438
- export fn editorViewGetNextWordBoundary(view: *editor_view.EditorView, outPtr: *ExternalVisualCursor) void {
1439
- const vcursor = view.getNextWordBoundary();
1440
- outPtr.* = .{
1441
- .visual_row = vcursor.visual_row,
1442
- .visual_col = vcursor.visual_col,
1443
- .logical_row = vcursor.logical_row,
1444
- .logical_col = vcursor.logical_col,
1445
- .offset = vcursor.offset,
1446
- };
1447
- }
1448
-
1449
- export fn editorViewGetPrevWordBoundary(view: *editor_view.EditorView, outPtr: *ExternalVisualCursor) void {
1450
- const vcursor = view.getPrevWordBoundary();
1451
- outPtr.* = .{
1452
- .visual_row = vcursor.visual_row,
1453
- .visual_col = vcursor.visual_col,
1454
- .logical_row = vcursor.logical_row,
1455
- .logical_col = vcursor.logical_col,
1456
- .offset = vcursor.offset,
1457
- };
1458
- }
1459
-
1460
- export fn editorViewGetEOL(view: *editor_view.EditorView, outPtr: *ExternalVisualCursor) void {
1461
- const vcursor = view.getEOL();
1462
- outPtr.* = .{
1463
- .visual_row = vcursor.visual_row,
1464
- .visual_col = vcursor.visual_col,
1465
- .logical_row = vcursor.logical_row,
1466
- .logical_col = vcursor.logical_col,
1467
- .offset = vcursor.offset,
1468
- };
1469
- }
1470
-
1471
- export fn editorViewGetVisualSOL(view: *editor_view.EditorView, outPtr: *ExternalVisualCursor) void {
1472
- const vcursor = view.getVisualSOL();
1473
- outPtr.* = .{
1474
- .visual_row = vcursor.visual_row,
1475
- .visual_col = vcursor.visual_col,
1476
- .logical_row = vcursor.logical_row,
1477
- .logical_col = vcursor.logical_col,
1478
- .offset = vcursor.offset,
1479
- };
1480
- }
1481
-
1482
- export fn editorViewGetVisualEOL(view: *editor_view.EditorView, outPtr: *ExternalVisualCursor) void {
1483
- const vcursor = view.getVisualEOL();
1484
- outPtr.* = .{
1485
- .visual_row = vcursor.visual_row,
1486
- .visual_col = vcursor.visual_col,
1487
- .logical_row = vcursor.logical_row,
1488
- .logical_col = vcursor.logical_col,
1489
- .offset = vcursor.offset,
1490
- };
1491
- }
1492
-
1493
- export fn editorViewSetPlaceholderStyledText(
1494
- view: *editor_view.EditorView,
1495
- chunksPtr: [*]const text_buffer.StyledChunk,
1496
- chunkCount: usize,
1497
- ) void {
1498
- if (chunkCount == 0) {
1499
- view.setPlaceholderStyledText(&[_]text_buffer.StyledChunk{}) catch {};
1500
- return;
1501
- }
1502
- const chunks = chunksPtr[0..chunkCount];
1503
- view.setPlaceholderStyledText(chunks) catch {};
1504
- }
1505
-
1506
- export fn editorViewSetTabIndicator(view: *editor_view.EditorView, indicator: u32) void {
1507
- view.setTabIndicator(indicator);
1508
- }
1509
-
1510
- export fn editorViewSetTabIndicatorColor(view: *editor_view.EditorView, color: [*]const f32) void {
1511
- view.setTabIndicatorColor(utils.f32PtrToRGBA(color));
1512
- }
1513
-
1514
- export fn bufferDrawEditorView(
1515
- bufferPtr: *buffer.OptimizedBuffer,
1516
- viewPtr: *editor_view.EditorView,
1517
- x: i32,
1518
- y: i32,
1519
- ) void {
1520
- bufferPtr.drawEditorView(viewPtr, x, y) catch {};
1521
- }
1522
-
1523
- export fn bufferDrawTextBufferView(
1524
- bufferPtr: *buffer.OptimizedBuffer,
1525
- viewPtr: *text_buffer_view.UnifiedTextBufferView,
1526
- x: i32,
1527
- y: i32,
1528
- ) void {
1529
- bufferPtr.drawTextBuffer(viewPtr, x, y) catch {};
1530
- }
1531
-
1532
- pub const ExternalHighlight = extern struct {
1533
- start: u32,
1534
- end: u32,
1535
- style_id: u32,
1536
- priority: u8,
1537
- hl_ref: u16,
1538
- };
1539
-
1540
- pub const ExternalLogicalCursor = extern struct {
1541
- row: u32,
1542
- col: u32,
1543
- offset: u32,
1544
- };
1545
-
1546
- pub const ExternalVisualCursor = extern struct {
1547
- visual_row: u32,
1548
- visual_col: u32,
1549
- logical_row: u32,
1550
- logical_col: u32,
1551
- offset: u32,
1552
- };
1553
-
1554
- pub const ExternalLineInfo = extern struct {
1555
- start_cols_ptr: [*]const u32,
1556
- start_cols_len: u32,
1557
- width_cols_ptr: [*]const u32,
1558
- width_cols_len: u32,
1559
- sources_ptr: [*]const u32,
1560
- sources_len: u32,
1561
- wraps_ptr: [*]const u32,
1562
- wraps_len: u32,
1563
- width_cols_max: u32,
1564
- };
1565
-
1566
- export fn textBufferAddHighlightByCharRange(
1567
- tb: *text_buffer.UnifiedTextBuffer,
1568
- hl_ptr: [*]const ExternalHighlight,
1569
- ) void {
1570
- const hl = hl_ptr[0];
1571
- // For char-range highlights, start/end in the struct are unused (passed as char_start/char_end)
1572
- tb.addHighlightByCharRange(hl.start, hl.end, hl.style_id, hl.priority, hl.hl_ref) catch {};
1573
- }
1574
-
1575
- export fn textBufferAddHighlight(
1576
- tb: *text_buffer.UnifiedTextBuffer,
1577
- line_idx: u32,
1578
- hl_ptr: [*]const ExternalHighlight,
1579
- ) void {
1580
- const hl = hl_ptr[0];
1581
- // For line-based highlights, start/end are column offsets
1582
- tb.addHighlight(line_idx, hl.start, hl.end, hl.style_id, hl.priority, hl.hl_ref) catch {};
1583
- }
1584
-
1585
- export fn textBufferRemoveHighlightsByRef(tb: *text_buffer.UnifiedTextBuffer, hl_ref: u16) void {
1586
- tb.removeHighlightsByRef(hl_ref);
1587
- }
1588
-
1589
- export fn textBufferClearLineHighlights(tb: *text_buffer.UnifiedTextBuffer, line_idx: u32) void {
1590
- tb.clearLineHighlights(line_idx);
1591
- }
1592
-
1593
- export fn textBufferClearAllHighlights(tb: *text_buffer.UnifiedTextBuffer) void {
1594
- tb.clearAllHighlights();
1595
- }
1596
-
1597
- export fn textBufferSetSyntaxStyle(tb: *text_buffer.UnifiedTextBuffer, style: ?*syntax_style.SyntaxStyle) void {
1598
- tb.setSyntaxStyle(style);
1599
- }
1600
-
1601
- export fn textBufferGetLineHighlightsPtr(
1602
- tb: *text_buffer.UnifiedTextBuffer,
1603
- line_idx: u32,
1604
- out_count: *usize,
1605
- ) ?[*]const ExternalHighlight {
1606
- const highs = tb.getLineHighlightsSlice(@intCast(line_idx));
1607
-
1608
- if (highs.len == 0) {
1609
- out_count.* = 0;
1610
- return null;
1611
- }
1612
-
1613
- var slice = globalAllocator.alloc(ExternalHighlight, highs.len) catch return null;
1614
-
1615
- for (highs, 0..) |hl, i| {
1616
- slice[i] = .{
1617
- .start = hl.col_start,
1618
- .end = hl.col_end,
1619
- .style_id = hl.style_id,
1620
- .priority = hl.priority,
1621
- .hl_ref = hl.hl_ref,
1622
- };
1623
- }
1624
-
1625
- out_count.* = highs.len;
1626
- return slice.ptr;
1627
- }
1628
-
1629
- export fn textBufferFreeLineHighlights(ptr: [*]const ExternalHighlight, count: usize) void {
1630
- globalAllocator.free(@constCast(ptr)[0..count]);
1631
- }
1632
-
1633
- export fn textBufferGetHighlightCount(tb: *text_buffer.UnifiedTextBuffer) u32 {
1634
- return tb.getHighlightCount();
1635
- }
1636
-
1637
- export fn textBufferGetTextRange(tb: *text_buffer.UnifiedTextBuffer, start_offset: u32, end_offset: u32, outPtr: [*]u8, maxLen: usize) usize {
1638
- const outBuffer = outPtr[0..maxLen];
1639
- return tb.getTextRange(start_offset, end_offset, outBuffer);
1640
- }
1641
-
1642
- export fn textBufferGetTextRangeByCoords(tb: *text_buffer.UnifiedTextBuffer, start_row: u32, start_col: u32, end_row: u32, end_col: u32, outPtr: [*]u8, maxLen: usize) usize {
1643
- const outBuffer = outPtr[0..maxLen];
1644
- return tb.getTextRangeByCoords(start_row, start_col, end_row, end_col, outBuffer);
1645
- }
1646
-
1647
- // SyntaxStyle functions
1648
- export fn createSyntaxStyle() ?*syntax_style.SyntaxStyle {
1649
- return syntax_style.SyntaxStyle.init(globalAllocator) catch |err| {
1650
- logger.err("Failed to create SyntaxStyle: {}", .{err});
1651
- return null;
1652
- };
1653
- }
1654
-
1655
- export fn destroySyntaxStyle(style: *syntax_style.SyntaxStyle) void {
1656
- style.deinit();
1657
- }
1658
-
1659
- export fn syntaxStyleRegister(style: *syntax_style.SyntaxStyle, namePtr: [*]const u8, nameLen: usize, fg: ?[*]const f32, bg: ?[*]const f32, attributes: u32) u32 {
1660
- const name = namePtr[0..nameLen];
1661
- const fgColor = if (fg) |fgPtr| utils.f32PtrToRGBA(fgPtr) else null;
1662
- const bgColor = if (bg) |bgPtr| utils.f32PtrToRGBA(bgPtr) else null;
1663
- return style.registerStyle(name, fgColor, bgColor, attributes) catch 0;
1664
- }
1665
-
1666
- export fn syntaxStyleResolveByName(style: *syntax_style.SyntaxStyle, namePtr: [*]const u8, nameLen: usize) u32 {
1667
- const name = namePtr[0..nameLen];
1668
- return style.resolveByName(name) orelse 0;
1669
- }
1670
-
1671
- export fn syntaxStyleGetStyleCount(style: *syntax_style.SyntaxStyle) usize {
1672
- return style.getStyleCount();
1673
- }
1674
-
1675
- // Unicode encoding API
1676
-
1677
- pub const EncodedChar = extern struct {
1678
- width: u8,
1679
- char: u32,
1680
- };
1681
-
1682
- export fn encodeUnicode(
1683
- textPtr: [*]const u8,
1684
- textLen: usize,
1685
- outPtr: *[*]EncodedChar,
1686
- outLenPtr: *usize,
1687
- widthMethod: u8,
1688
- ) bool {
1689
- const text = textPtr[0..textLen];
1690
- const pool = gp.initGlobalPool(globalArena);
1691
- const wMethod: utf8.WidthMethod = if (widthMethod == 0) .wcwidth else .unicode;
1692
-
1693
- // Check if ASCII only for optimization
1694
- const is_ascii_only = utf8.isAsciiOnly(text);
1695
-
1696
- // Find grapheme info
1697
- var grapheme_list: std.ArrayListUnmanaged(utf8.GraphemeInfo) = .{};
1698
- defer grapheme_list.deinit(globalAllocator);
1699
-
1700
- const tab_width: u8 = 2;
1701
- utf8.findGraphemeInfo(text, tab_width, is_ascii_only, wMethod, globalAllocator, &grapheme_list) catch return false;
1702
- const specials = grapheme_list.items;
1703
-
1704
- // Allocate output array
1705
- const estimated_count = if (is_ascii_only) text.len else text.len * 2;
1706
- var result = globalAllocator.alloc(EncodedChar, estimated_count) catch return false;
1707
- var result_idx: usize = 0;
1708
- var success = false;
1709
- var pending_gid: ?u32 = null; // Track grapheme allocated but not yet stored in result
1710
-
1711
- // Clean up result array and any allocated grapheme IDs on failure
1712
- defer {
1713
- if (!success) {
1714
- // Clean up pending grapheme that wasn't stored yet
1715
- if (pending_gid) |gid| {
1716
- // Try decref first (works if incref was called, refcount >= 1)
1717
- // If that fails (refcount was 0), use freeUnreferenced
1718
- pool.decref(gid) catch {
1719
- pool.freeUnreferenced(gid) catch {};
1720
- };
1721
- }
1722
- // Decref any grapheme IDs we allocated before the failure
1723
- for (result[0..result_idx]) |encoded_char| {
1724
- if (gp.isGraphemeChar(encoded_char.char)) {
1725
- const gid = gp.graphemeIdFromChar(encoded_char.char);
1726
- pool.decref(gid) catch {};
1727
- }
1728
- }
1729
- globalAllocator.free(result);
1730
- }
1731
- }
1732
-
1733
- var byte_offset: u32 = 0;
1734
- var col: u32 = 0;
1735
- var special_idx: usize = 0;
1736
-
1737
- while (byte_offset < text.len) {
1738
- const at_special = special_idx < specials.len and specials[special_idx].col_offset == col;
1739
-
1740
- var grapheme_bytes: []const u8 = undefined;
1741
- var g_width: u8 = undefined;
1742
-
1743
- if (at_special) {
1744
- const g = specials[special_idx];
1745
- grapheme_bytes = text[g.byte_offset .. g.byte_offset + g.byte_len];
1746
- g_width = g.width;
1747
- byte_offset = g.byte_offset + g.byte_len;
1748
- special_idx += 1;
1749
- } else {
1750
- if (byte_offset >= text.len) break;
1751
- grapheme_bytes = text[byte_offset .. byte_offset + 1];
1752
- g_width = 1;
1753
- byte_offset += 1;
1754
- }
1755
-
1756
- const cell_width = utf8.getWidthAt(text, if (at_special) specials[special_idx - 1].byte_offset else byte_offset - 1, tab_width, wMethod);
1757
- if (cell_width == 0) {
1758
- col += g_width;
1759
- continue;
1760
- }
1761
-
1762
- // Encode the character
1763
- var encoded_char: u32 = 0;
1764
- if (grapheme_bytes.len == 1 and cell_width == 1 and grapheme_bytes[0] >= 32) {
1765
- // Simple ASCII character
1766
- encoded_char = @as(u32, grapheme_bytes[0]);
1767
- } else {
1768
- // Multi-byte or special character - allocate in pool
1769
- const gid = pool.alloc(grapheme_bytes) catch return false;
1770
- pending_gid = gid; // Track until stored in result
1771
- encoded_char = gp.packGraphemeStart(gid & gp.GRAPHEME_ID_MASK, cell_width);
1772
-
1773
- // Incref since we're handing this off to the caller
1774
- // Note: incref can only fail if gid is invalid, which shouldn't happen
1775
- // for a freshly allocated gid. If it does fail, the slot leaks but
1776
- // this is an edge case that indicates a bug elsewhere.
1777
- pool.incref(gid) catch return false;
1778
- }
1779
-
1780
- // Ensure we have space
1781
- if (result_idx >= result.len) {
1782
- const new_len = result.len * 2;
1783
- result = globalAllocator.realloc(result, new_len) catch return false;
1784
- }
1785
-
1786
- result[result_idx] = EncodedChar{
1787
- .width = @intCast(cell_width),
1788
- .char = encoded_char,
1789
- };
1790
- pending_gid = null; // Successfully stored, no longer pending
1791
- result_idx += 1;
1792
- col += g_width;
1793
- }
1794
-
1795
- // Trim to actual size
1796
- result = globalAllocator.realloc(result, result_idx) catch result;
1797
-
1798
- outPtr.* = result.ptr;
1799
- outLenPtr.* = result_idx;
1800
- success = true;
1801
- return true;
1802
- }
1803
-
1804
- export fn freeUnicode(charsPtr: [*]const EncodedChar, charsLen: usize) void {
1805
- const chars = charsPtr[0..charsLen];
1806
- const pool = gp.initGlobalPool(globalArena);
1807
-
1808
- for (chars) |encoded_char| {
1809
- const char = encoded_char.char;
1810
-
1811
- // Check if this is a packed grapheme
1812
- if (gp.isGraphemeChar(char)) {
1813
- const gid = gp.graphemeIdFromChar(char);
1814
- pool.decref(gid) catch {};
1815
- }
1816
- }
1817
-
1818
- // Free the array itself
1819
- globalAllocator.free(chars);
1820
- }
1821
-
1822
- export fn bufferDrawChar(
1823
- bufferPtr: *buffer.OptimizedBuffer,
1824
- char: u32,
1825
- x: u32,
1826
- y: u32,
1827
- fg: [*]const f32,
1828
- bg: [*]const f32,
1829
- attributes: u32,
1830
- ) void {
1831
- const rgbaFg = utils.f32PtrToRGBA(fg);
1832
- const rgbaBg = utils.f32PtrToRGBA(bg);
1833
- bufferPtr.drawChar(char, x, y, rgbaFg, rgbaBg, attributes) catch {};
1834
- }