electrobun 0.0.1 → 0.0.2

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 (667) hide show
  1. package/.gitmodules +3 -0
  2. package/dist/webview +0 -0
  3. package/package.json +1 -1
  4. package/src/cli/build/electrobun +0 -0
  5. package/example/assets/electrobun-logo-32-template.png +0 -0
  6. package/example/buildScript.ts +0 -1
  7. package/example/bun.lockb +0 -0
  8. package/example/electrobun.config +0 -48
  9. package/example/icon.iconset/icon_128x128.png +0 -0
  10. package/example/icon.iconset/icon_128x128@2x.png +0 -0
  11. package/example/icon.iconset/icon_16x16.png +0 -0
  12. package/example/icon.iconset/icon_16x16@2x.png +0 -0
  13. package/example/icon.iconset/icon_256x256.png +0 -0
  14. package/example/icon.iconset/icon_256x256@2x.png +0 -0
  15. package/example/icon.iconset/icon_32x32.png +0 -0
  16. package/example/icon.iconset/icon_32x32@2x.png +0 -0
  17. package/example/icon.iconset/icon_512x512.png +0 -0
  18. package/example/icon.iconset/icon_512x512@2x.png +0 -0
  19. package/example/package-lock.json +0 -32
  20. package/example/package.json +0 -11
  21. package/example/readme.md +0 -0
  22. package/example/src/bun/index.ts +0 -403
  23. package/example/src/mainview/index.css +0 -4
  24. package/example/src/mainview/index.html +0 -13
  25. package/example/src/mainview/index.ts +0 -45
  26. package/example/src/mainview/rpc.ts +0 -36
  27. package/example/src/myextension/preload.ts +0 -15
  28. package/example/src/myextension/rpc.ts +0 -15
  29. package/example/src/webviewtag/electrobun.png +0 -0
  30. package/example/src/webviewtag/index.html +0 -94
  31. package/example/src/webviewtag/index.ts +0 -26
  32. package/src/bsdiff/bsdiff.zig +0 -842
  33. package/src/bsdiff/bspatch.zig +0 -253
  34. package/src/bsdiff/build.zig +0 -73
  35. package/src/bsdiff/zig-out/bin/bsdiff +0 -0
  36. package/src/bsdiff/zig-out/bin/bspatch +0 -0
  37. package/src/bsdiff/zig-out/lib/libzstd.a +0 -0
  38. package/src/bsdiff/zstd/.buckconfig +0 -9
  39. package/src/bsdiff/zstd/.buckversion +0 -1
  40. package/src/bsdiff/zstd/.circleci/config.yml +0 -123
  41. package/src/bsdiff/zstd/.circleci/images/primary/Dockerfile +0 -9
  42. package/src/bsdiff/zstd/.cirrus.yml +0 -10
  43. package/src/bsdiff/zstd/.gitattributes +0 -21
  44. package/src/bsdiff/zstd/.github/ISSUE_TEMPLATE/bug_report.md +0 -35
  45. package/src/bsdiff/zstd/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  46. package/src/bsdiff/zstd/.github/dependabot.yml +0 -6
  47. package/src/bsdiff/zstd/.github/workflows/commit.yml +0 -89
  48. package/src/bsdiff/zstd/.github/workflows/dev-long-tests.yml +0 -297
  49. package/src/bsdiff/zstd/.github/workflows/dev-short-tests.yml +0 -633
  50. package/src/bsdiff/zstd/.github/workflows/nightly.yml +0 -65
  51. package/src/bsdiff/zstd/.github/workflows/publish-release-artifacts.yml +0 -73
  52. package/src/bsdiff/zstd/.github/workflows/scorecards.yml +0 -64
  53. package/src/bsdiff/zstd/.github/workflows/windows-artifacts.yml +0 -58
  54. package/src/bsdiff/zstd/CHANGELOG +0 -837
  55. package/src/bsdiff/zstd/CODE_OF_CONDUCT.md +0 -5
  56. package/src/bsdiff/zstd/CONTRIBUTING.md +0 -489
  57. package/src/bsdiff/zstd/COPYING +0 -339
  58. package/src/bsdiff/zstd/LICENSE +0 -30
  59. package/src/bsdiff/zstd/Makefile +0 -457
  60. package/src/bsdiff/zstd/Package.swift +0 -36
  61. package/src/bsdiff/zstd/README.md +0 -227
  62. package/src/bsdiff/zstd/SECURITY.md +0 -15
  63. package/src/bsdiff/zstd/TESTING.md +0 -43
  64. package/src/bsdiff/zstd/build/LICENSE +0 -0
  65. package/src/bsdiff/zstd/build/README.md +0 -56
  66. package/src/bsdiff/zstd/build/VS2008/fullbench/fullbench.vcproj +0 -549
  67. package/src/bsdiff/zstd/build/VS2008/fuzzer/fuzzer.vcproj +0 -585
  68. package/src/bsdiff/zstd/build/VS2008/zstd/zstd.vcproj +0 -677
  69. package/src/bsdiff/zstd/build/VS2008/zstd.sln +0 -56
  70. package/src/bsdiff/zstd/build/VS2008/zstdlib/zstdlib.vcproj +0 -635
  71. package/src/bsdiff/zstd/build/VS2010/CompileAsCpp.props +0 -8
  72. package/src/bsdiff/zstd/build/VS2010/datagen/datagen.vcxproj +0 -170
  73. package/src/bsdiff/zstd/build/VS2010/fullbench/fullbench.vcxproj +0 -218
  74. package/src/bsdiff/zstd/build/VS2010/fullbench-dll/fullbench-dll.vcxproj +0 -189
  75. package/src/bsdiff/zstd/build/VS2010/fuzzer/fuzzer.vcxproj +0 -223
  76. package/src/bsdiff/zstd/build/VS2010/libzstd/libzstd.vcxproj +0 -242
  77. package/src/bsdiff/zstd/build/VS2010/libzstd-dll/libzstd-dll.rc +0 -51
  78. package/src/bsdiff/zstd/build/VS2010/libzstd-dll/libzstd-dll.vcxproj +0 -249
  79. package/src/bsdiff/zstd/build/VS2010/zstd/zstd.rc +0 -51
  80. package/src/bsdiff/zstd/build/VS2010/zstd/zstd.vcxproj +0 -265
  81. package/src/bsdiff/zstd/build/VS2010/zstd.sln +0 -89
  82. package/src/bsdiff/zstd/build/VS_scripts/README.md +0 -64
  83. package/src/bsdiff/zstd/build/VS_scripts/build.VS2010.cmd +0 -7
  84. package/src/bsdiff/zstd/build/VS_scripts/build.VS2012.cmd +0 -6
  85. package/src/bsdiff/zstd/build/VS_scripts/build.VS2013.cmd +0 -7
  86. package/src/bsdiff/zstd/build/VS_scripts/build.VS2015.cmd +0 -7
  87. package/src/bsdiff/zstd/build/VS_scripts/build.VS2017.cmd +0 -7
  88. package/src/bsdiff/zstd/build/VS_scripts/build.VS2017Community.cmd +0 -7
  89. package/src/bsdiff/zstd/build/VS_scripts/build.VS2017Enterprise.cmd +0 -7
  90. package/src/bsdiff/zstd/build/VS_scripts/build.VS2017Professional.cmd +0 -7
  91. package/src/bsdiff/zstd/build/VS_scripts/build.generic.cmd +0 -72
  92. package/src/bsdiff/zstd/build/cmake/CMakeLists.txt +0 -216
  93. package/src/bsdiff/zstd/build/cmake/CMakeModules/AddZstdCompilationFlags.cmake +0 -121
  94. package/src/bsdiff/zstd/build/cmake/CMakeModules/FindLibLZ4.cmake +0 -49
  95. package/src/bsdiff/zstd/build/cmake/CMakeModules/GetZstdLibraryVersion.cmake +0 -10
  96. package/src/bsdiff/zstd/build/cmake/CMakeModules/JoinPaths.cmake +0 -23
  97. package/src/bsdiff/zstd/build/cmake/README.md +0 -136
  98. package/src/bsdiff/zstd/build/cmake/contrib/CMakeLists.txt +0 -13
  99. package/src/bsdiff/zstd/build/cmake/contrib/gen_html/CMakeLists.txt +0 -30
  100. package/src/bsdiff/zstd/build/cmake/contrib/pzstd/CMakeLists.txt +0 -39
  101. package/src/bsdiff/zstd/build/cmake/lib/CMakeLists.txt +0 -253
  102. package/src/bsdiff/zstd/build/cmake/lib/cmake_uninstall.cmake.in +0 -22
  103. package/src/bsdiff/zstd/build/cmake/programs/CMakeLists.txt +0 -144
  104. package/src/bsdiff/zstd/build/cmake/tests/CMakeLists.txt +0 -118
  105. package/src/bsdiff/zstd/build/cmake/zstdConfig.cmake.in +0 -10
  106. package/src/bsdiff/zstd/build/meson/GetZstdLibraryVersion.py +0 -39
  107. package/src/bsdiff/zstd/build/meson/InstallSymlink.py +0 -55
  108. package/src/bsdiff/zstd/build/meson/README.md +0 -38
  109. package/src/bsdiff/zstd/build/meson/contrib/gen_html/meson.build +0 -30
  110. package/src/bsdiff/zstd/build/meson/contrib/meson.build +0 -12
  111. package/src/bsdiff/zstd/build/meson/contrib/pzstd/meson.build +0 -25
  112. package/src/bsdiff/zstd/build/meson/lib/meson.build +0 -167
  113. package/src/bsdiff/zstd/build/meson/meson.build +0 -145
  114. package/src/bsdiff/zstd/build/meson/meson_options.txt +0 -36
  115. package/src/bsdiff/zstd/build/meson/programs/meson.build +0 -124
  116. package/src/bsdiff/zstd/build/meson/tests/meson.build +0 -217
  117. package/src/bsdiff/zstd/build/meson/tests/valgrindTest.py +0 -90
  118. package/src/bsdiff/zstd/build/single_file_libs/README.md +0 -33
  119. package/src/bsdiff/zstd/build/single_file_libs/build_decoder_test.sh +0 -91
  120. package/src/bsdiff/zstd/build/single_file_libs/build_library_test.sh +0 -97
  121. package/src/bsdiff/zstd/build/single_file_libs/combine.py +0 -234
  122. package/src/bsdiff/zstd/build/single_file_libs/combine.sh +0 -249
  123. package/src/bsdiff/zstd/build/single_file_libs/create_single_file_decoder.sh +0 -19
  124. package/src/bsdiff/zstd/build/single_file_libs/create_single_file_library.sh +0 -19
  125. package/src/bsdiff/zstd/build/single_file_libs/examples/README.md +0 -11
  126. package/src/bsdiff/zstd/build/single_file_libs/examples/emscripten.c +0 -340
  127. package/src/bsdiff/zstd/build/single_file_libs/examples/roundtrip.c +0 -83
  128. package/src/bsdiff/zstd/build/single_file_libs/examples/shell.html +0 -31
  129. package/src/bsdiff/zstd/build/single_file_libs/examples/simple.c +0 -75
  130. package/src/bsdiff/zstd/build/single_file_libs/examples/testcard-dxt1.inl +0 -2731
  131. package/src/bsdiff/zstd/build/single_file_libs/examples/testcard-zstd.inl +0 -261
  132. package/src/bsdiff/zstd/build/single_file_libs/examples/testcard.png +0 -0
  133. package/src/bsdiff/zstd/build/single_file_libs/zstd-in.c +0 -90
  134. package/src/bsdiff/zstd/build/single_file_libs/zstddeclib-in.c +0 -62
  135. package/src/bsdiff/zstd/contrib/VS2005/README.md +0 -3
  136. package/src/bsdiff/zstd/contrib/VS2005/fullbench/fullbench.vcproj +0 -440
  137. package/src/bsdiff/zstd/contrib/VS2005/fuzzer/fuzzer.vcproj +0 -488
  138. package/src/bsdiff/zstd/contrib/VS2005/zstd/zstd.vcproj +0 -552
  139. package/src/bsdiff/zstd/contrib/VS2005/zstd.sln +0 -55
  140. package/src/bsdiff/zstd/contrib/VS2005/zstdlib/zstdlib.vcproj +0 -546
  141. package/src/bsdiff/zstd/contrib/cleanTabs +0 -2
  142. package/src/bsdiff/zstd/contrib/diagnose_corruption/Makefile +0 -35
  143. package/src/bsdiff/zstd/contrib/diagnose_corruption/check_flipped_bits.c +0 -400
  144. package/src/bsdiff/zstd/contrib/docker/Dockerfile +0 -20
  145. package/src/bsdiff/zstd/contrib/docker/README.md +0 -20
  146. package/src/bsdiff/zstd/contrib/externalSequenceProducer/Makefile +0 -40
  147. package/src/bsdiff/zstd/contrib/externalSequenceProducer/README.md +0 -14
  148. package/src/bsdiff/zstd/contrib/externalSequenceProducer/main.c +0 -107
  149. package/src/bsdiff/zstd/contrib/externalSequenceProducer/sequence_producer.c +0 -80
  150. package/src/bsdiff/zstd/contrib/externalSequenceProducer/sequence_producer.h +0 -26
  151. package/src/bsdiff/zstd/contrib/freestanding_lib/freestanding.py +0 -774
  152. package/src/bsdiff/zstd/contrib/gen_html/Makefile +0 -51
  153. package/src/bsdiff/zstd/contrib/gen_html/README.md +0 -31
  154. package/src/bsdiff/zstd/contrib/gen_html/gen-zstd-manual.sh +0 -9
  155. package/src/bsdiff/zstd/contrib/gen_html/gen_html.cpp +0 -224
  156. package/src/bsdiff/zstd/contrib/largeNbDicts/Makefile +0 -58
  157. package/src/bsdiff/zstd/contrib/largeNbDicts/README.md +0 -33
  158. package/src/bsdiff/zstd/contrib/largeNbDicts/largeNbDicts.c +0 -1085
  159. package/src/bsdiff/zstd/contrib/linux-kernel/Makefile +0 -108
  160. package/src/bsdiff/zstd/contrib/linux-kernel/README.md +0 -14
  161. package/src/bsdiff/zstd/contrib/linux-kernel/btrfs-benchmark.sh +0 -104
  162. package/src/bsdiff/zstd/contrib/linux-kernel/btrfs-extract-benchmark.sh +0 -99
  163. package/src/bsdiff/zstd/contrib/linux-kernel/decompress_sources.h +0 -34
  164. package/src/bsdiff/zstd/contrib/linux-kernel/linux.mk +0 -43
  165. package/src/bsdiff/zstd/contrib/linux-kernel/linux_zstd.h +0 -447
  166. package/src/bsdiff/zstd/contrib/linux-kernel/mem.h +0 -262
  167. package/src/bsdiff/zstd/contrib/linux-kernel/squashfs-benchmark.sh +0 -39
  168. package/src/bsdiff/zstd/contrib/linux-kernel/test/Makefile +0 -49
  169. package/src/bsdiff/zstd/contrib/linux-kernel/test/include/asm/unaligned.h +0 -187
  170. package/src/bsdiff/zstd/contrib/linux-kernel/test/include/linux/compiler.h +0 -23
  171. package/src/bsdiff/zstd/contrib/linux-kernel/test/include/linux/errno.h +0 -15
  172. package/src/bsdiff/zstd/contrib/linux-kernel/test/include/linux/kernel.h +0 -19
  173. package/src/bsdiff/zstd/contrib/linux-kernel/test/include/linux/limits.h +0 -15
  174. package/src/bsdiff/zstd/contrib/linux-kernel/test/include/linux/math64.h +0 -15
  175. package/src/bsdiff/zstd/contrib/linux-kernel/test/include/linux/module.h +0 -20
  176. package/src/bsdiff/zstd/contrib/linux-kernel/test/include/linux/printk.h +0 -15
  177. package/src/bsdiff/zstd/contrib/linux-kernel/test/include/linux/stddef.h +0 -15
  178. package/src/bsdiff/zstd/contrib/linux-kernel/test/include/linux/swab.h +0 -16
  179. package/src/bsdiff/zstd/contrib/linux-kernel/test/include/linux/types.h +0 -16
  180. package/src/bsdiff/zstd/contrib/linux-kernel/test/include/linux/xxhash.h +0 -745
  181. package/src/bsdiff/zstd/contrib/linux-kernel/test/macro-test.sh +0 -44
  182. package/src/bsdiff/zstd/contrib/linux-kernel/test/static_test.c +0 -52
  183. package/src/bsdiff/zstd/contrib/linux-kernel/test/test.c +0 -229
  184. package/src/bsdiff/zstd/contrib/linux-kernel/zstd_common_module.c +0 -29
  185. package/src/bsdiff/zstd/contrib/linux-kernel/zstd_compress_module.c +0 -164
  186. package/src/bsdiff/zstd/contrib/linux-kernel/zstd_decompress_module.c +0 -105
  187. package/src/bsdiff/zstd/contrib/linux-kernel/zstd_deps.h +0 -121
  188. package/src/bsdiff/zstd/contrib/match_finders/README.md +0 -42
  189. package/src/bsdiff/zstd/contrib/match_finders/zstd_edist.c +0 -558
  190. package/src/bsdiff/zstd/contrib/match_finders/zstd_edist.h +0 -70
  191. package/src/bsdiff/zstd/contrib/premake/premake4.lua +0 -6
  192. package/src/bsdiff/zstd/contrib/premake/zstd.lua +0 -80
  193. package/src/bsdiff/zstd/contrib/pzstd/BUCK +0 -72
  194. package/src/bsdiff/zstd/contrib/pzstd/ErrorHolder.h +0 -54
  195. package/src/bsdiff/zstd/contrib/pzstd/Logging.h +0 -72
  196. package/src/bsdiff/zstd/contrib/pzstd/Makefile +0 -265
  197. package/src/bsdiff/zstd/contrib/pzstd/Options.cpp +0 -424
  198. package/src/bsdiff/zstd/contrib/pzstd/Options.h +0 -71
  199. package/src/bsdiff/zstd/contrib/pzstd/Pzstd.cpp +0 -618
  200. package/src/bsdiff/zstd/contrib/pzstd/Pzstd.h +0 -153
  201. package/src/bsdiff/zstd/contrib/pzstd/README.md +0 -56
  202. package/src/bsdiff/zstd/contrib/pzstd/SkippableFrame.cpp +0 -30
  203. package/src/bsdiff/zstd/contrib/pzstd/SkippableFrame.h +0 -64
  204. package/src/bsdiff/zstd/contrib/pzstd/images/Cspeed.png +0 -0
  205. package/src/bsdiff/zstd/contrib/pzstd/images/Dspeed.png +0 -0
  206. package/src/bsdiff/zstd/contrib/pzstd/main.cpp +0 -27
  207. package/src/bsdiff/zstd/contrib/pzstd/test/BUCK +0 -37
  208. package/src/bsdiff/zstd/contrib/pzstd/test/OptionsTest.cpp +0 -536
  209. package/src/bsdiff/zstd/contrib/pzstd/test/PzstdTest.cpp +0 -149
  210. package/src/bsdiff/zstd/contrib/pzstd/test/RoundTrip.h +0 -86
  211. package/src/bsdiff/zstd/contrib/pzstd/test/RoundTripTest.cpp +0 -86
  212. package/src/bsdiff/zstd/contrib/pzstd/utils/BUCK +0 -75
  213. package/src/bsdiff/zstd/contrib/pzstd/utils/Buffer.h +0 -99
  214. package/src/bsdiff/zstd/contrib/pzstd/utils/FileSystem.h +0 -96
  215. package/src/bsdiff/zstd/contrib/pzstd/utils/Likely.h +0 -28
  216. package/src/bsdiff/zstd/contrib/pzstd/utils/Portability.h +0 -16
  217. package/src/bsdiff/zstd/contrib/pzstd/utils/Range.h +0 -133
  218. package/src/bsdiff/zstd/contrib/pzstd/utils/ResourcePool.h +0 -96
  219. package/src/bsdiff/zstd/contrib/pzstd/utils/ScopeGuard.h +0 -50
  220. package/src/bsdiff/zstd/contrib/pzstd/utils/ThreadPool.h +0 -58
  221. package/src/bsdiff/zstd/contrib/pzstd/utils/WorkQueue.h +0 -181
  222. package/src/bsdiff/zstd/contrib/pzstd/utils/test/BUCK +0 -35
  223. package/src/bsdiff/zstd/contrib/pzstd/utils/test/BufferTest.cpp +0 -89
  224. package/src/bsdiff/zstd/contrib/pzstd/utils/test/RangeTest.cpp +0 -82
  225. package/src/bsdiff/zstd/contrib/pzstd/utils/test/ResourcePoolTest.cpp +0 -72
  226. package/src/bsdiff/zstd/contrib/pzstd/utils/test/ScopeGuardTest.cpp +0 -28
  227. package/src/bsdiff/zstd/contrib/pzstd/utils/test/ThreadPoolTest.cpp +0 -71
  228. package/src/bsdiff/zstd/contrib/pzstd/utils/test/WorkQueueTest.cpp +0 -282
  229. package/src/bsdiff/zstd/contrib/recovery/Makefile +0 -35
  230. package/src/bsdiff/zstd/contrib/recovery/recover_directory.c +0 -152
  231. package/src/bsdiff/zstd/contrib/seekable_format/README.md +0 -42
  232. package/src/bsdiff/zstd/contrib/seekable_format/examples/Makefile +0 -53
  233. package/src/bsdiff/zstd/contrib/seekable_format/examples/parallel_compression.c +0 -214
  234. package/src/bsdiff/zstd/contrib/seekable_format/examples/parallel_processing.c +0 -194
  235. package/src/bsdiff/zstd/contrib/seekable_format/examples/seekable_compression.c +0 -136
  236. package/src/bsdiff/zstd/contrib/seekable_format/examples/seekable_decompression.c +0 -141
  237. package/src/bsdiff/zstd/contrib/seekable_format/examples/seekable_decompression_mem.c +0 -147
  238. package/src/bsdiff/zstd/contrib/seekable_format/tests/Makefile +0 -38
  239. package/src/bsdiff/zstd/contrib/seekable_format/tests/seekable_tests.c +0 -363
  240. package/src/bsdiff/zstd/contrib/seekable_format/zstd_seekable.h +0 -226
  241. package/src/bsdiff/zstd/contrib/seekable_format/zstd_seekable_compression_format.md +0 -116
  242. package/src/bsdiff/zstd/contrib/seekable_format/zstdseek_compress.c +0 -365
  243. package/src/bsdiff/zstd/contrib/seekable_format/zstdseek_decompress.c +0 -595
  244. package/src/bsdiff/zstd/contrib/seqBench/Makefile +0 -58
  245. package/src/bsdiff/zstd/contrib/seqBench/seqBench.c +0 -53
  246. package/src/bsdiff/zstd/contrib/snap/snapcraft.yaml +0 -28
  247. package/src/bsdiff/zstd/doc/README.md +0 -26
  248. package/src/bsdiff/zstd/doc/decompressor_errata.md +0 -148
  249. package/src/bsdiff/zstd/doc/decompressor_permissive.md +0 -60
  250. package/src/bsdiff/zstd/doc/educational_decoder/Makefile +0 -62
  251. package/src/bsdiff/zstd/doc/educational_decoder/README.md +0 -36
  252. package/src/bsdiff/zstd/doc/educational_decoder/harness.c +0 -119
  253. package/src/bsdiff/zstd/doc/educational_decoder/zstd_decompress.c +0 -2323
  254. package/src/bsdiff/zstd/doc/educational_decoder/zstd_decompress.h +0 -61
  255. package/src/bsdiff/zstd/doc/images/CSpeed2.png +0 -0
  256. package/src/bsdiff/zstd/doc/images/DCspeed5.png +0 -0
  257. package/src/bsdiff/zstd/doc/images/DSpeed3.png +0 -0
  258. package/src/bsdiff/zstd/doc/images/cdict_v136.png +0 -0
  259. package/src/bsdiff/zstd/doc/images/dict-cr.png +0 -0
  260. package/src/bsdiff/zstd/doc/images/dict-cs.png +0 -0
  261. package/src/bsdiff/zstd/doc/images/dict-ds.png +0 -0
  262. package/src/bsdiff/zstd/doc/images/zstd_cdict_v1_3_5.png +0 -0
  263. package/src/bsdiff/zstd/doc/images/zstd_logo86.png +0 -0
  264. package/src/bsdiff/zstd/doc/zstd_compression_format.md +0 -1737
  265. package/src/bsdiff/zstd/doc/zstd_manual.html +0 -2170
  266. package/src/bsdiff/zstd/examples/Makefile +0 -93
  267. package/src/bsdiff/zstd/examples/README.md +0 -46
  268. package/src/bsdiff/zstd/examples/common.h +0 -246
  269. package/src/bsdiff/zstd/examples/dictionary_compression.c +0 -107
  270. package/src/bsdiff/zstd/examples/dictionary_decompression.c +0 -99
  271. package/src/bsdiff/zstd/examples/multiple_simple_compression.c +0 -116
  272. package/src/bsdiff/zstd/examples/multiple_streaming_compression.c +0 -133
  273. package/src/bsdiff/zstd/examples/simple_compression.c +0 -68
  274. package/src/bsdiff/zstd/examples/simple_decompression.c +0 -65
  275. package/src/bsdiff/zstd/examples/streaming_compression.c +0 -146
  276. package/src/bsdiff/zstd/examples/streaming_compression_thread_pool.c +0 -180
  277. package/src/bsdiff/zstd/examples/streaming_decompression.c +0 -100
  278. package/src/bsdiff/zstd/examples/streaming_memory_usage.c +0 -137
  279. package/src/bsdiff/zstd/lib/BUCK +0 -232
  280. package/src/bsdiff/zstd/lib/Makefile +0 -369
  281. package/src/bsdiff/zstd/lib/README.md +0 -237
  282. package/src/bsdiff/zstd/lib/common/allocations.h +0 -55
  283. package/src/bsdiff/zstd/lib/common/bits.h +0 -200
  284. package/src/bsdiff/zstd/lib/common/bitstream.h +0 -457
  285. package/src/bsdiff/zstd/lib/common/compiler.h +0 -450
  286. package/src/bsdiff/zstd/lib/common/cpu.h +0 -249
  287. package/src/bsdiff/zstd/lib/common/debug.c +0 -30
  288. package/src/bsdiff/zstd/lib/common/debug.h +0 -116
  289. package/src/bsdiff/zstd/lib/common/entropy_common.c +0 -340
  290. package/src/bsdiff/zstd/lib/common/error_private.c +0 -63
  291. package/src/bsdiff/zstd/lib/common/error_private.h +0 -168
  292. package/src/bsdiff/zstd/lib/common/fse.h +0 -640
  293. package/src/bsdiff/zstd/lib/common/fse_decompress.c +0 -313
  294. package/src/bsdiff/zstd/lib/common/huf.h +0 -286
  295. package/src/bsdiff/zstd/lib/common/mem.h +0 -426
  296. package/src/bsdiff/zstd/lib/common/pool.c +0 -371
  297. package/src/bsdiff/zstd/lib/common/pool.h +0 -90
  298. package/src/bsdiff/zstd/lib/common/portability_macros.h +0 -158
  299. package/src/bsdiff/zstd/lib/common/threading.c +0 -182
  300. package/src/bsdiff/zstd/lib/common/threading.h +0 -150
  301. package/src/bsdiff/zstd/lib/common/xxhash.c +0 -18
  302. package/src/bsdiff/zstd/lib/common/xxhash.h +0 -7020
  303. package/src/bsdiff/zstd/lib/common/zstd_common.c +0 -48
  304. package/src/bsdiff/zstd/lib/common/zstd_deps.h +0 -111
  305. package/src/bsdiff/zstd/lib/common/zstd_internal.h +0 -392
  306. package/src/bsdiff/zstd/lib/common/zstd_trace.h +0 -163
  307. package/src/bsdiff/zstd/lib/compress/clevels.h +0 -134
  308. package/src/bsdiff/zstd/lib/compress/fse_compress.c +0 -625
  309. package/src/bsdiff/zstd/lib/compress/hist.c +0 -181
  310. package/src/bsdiff/zstd/lib/compress/hist.h +0 -75
  311. package/src/bsdiff/zstd/lib/compress/huf_compress.c +0 -1464
  312. package/src/bsdiff/zstd/lib/compress/zstd_compress.c +0 -7153
  313. package/src/bsdiff/zstd/lib/compress/zstd_compress_internal.h +0 -1534
  314. package/src/bsdiff/zstd/lib/compress/zstd_compress_literals.c +0 -235
  315. package/src/bsdiff/zstd/lib/compress/zstd_compress_literals.h +0 -39
  316. package/src/bsdiff/zstd/lib/compress/zstd_compress_sequences.c +0 -442
  317. package/src/bsdiff/zstd/lib/compress/zstd_compress_sequences.h +0 -54
  318. package/src/bsdiff/zstd/lib/compress/zstd_compress_superblock.c +0 -688
  319. package/src/bsdiff/zstd/lib/compress/zstd_compress_superblock.h +0 -32
  320. package/src/bsdiff/zstd/lib/compress/zstd_cwksp.h +0 -748
  321. package/src/bsdiff/zstd/lib/compress/zstd_double_fast.c +0 -770
  322. package/src/bsdiff/zstd/lib/compress/zstd_double_fast.h +0 -50
  323. package/src/bsdiff/zstd/lib/compress/zstd_fast.c +0 -968
  324. package/src/bsdiff/zstd/lib/compress/zstd_fast.h +0 -38
  325. package/src/bsdiff/zstd/lib/compress/zstd_lazy.c +0 -2199
  326. package/src/bsdiff/zstd/lib/compress/zstd_lazy.h +0 -202
  327. package/src/bsdiff/zstd/lib/compress/zstd_ldm.c +0 -730
  328. package/src/bsdiff/zstd/lib/compress/zstd_ldm.h +0 -117
  329. package/src/bsdiff/zstd/lib/compress/zstd_ldm_geartab.h +0 -106
  330. package/src/bsdiff/zstd/lib/compress/zstd_opt.c +0 -1576
  331. package/src/bsdiff/zstd/lib/compress/zstd_opt.h +0 -80
  332. package/src/bsdiff/zstd/lib/compress/zstdmt_compress.c +0 -1882
  333. package/src/bsdiff/zstd/lib/compress/zstdmt_compress.h +0 -113
  334. package/src/bsdiff/zstd/lib/decompress/huf_decompress.c +0 -1944
  335. package/src/bsdiff/zstd/lib/decompress/huf_decompress_amd64.S +0 -595
  336. package/src/bsdiff/zstd/lib/decompress/zstd_ddict.c +0 -244
  337. package/src/bsdiff/zstd/lib/decompress/zstd_ddict.h +0 -44
  338. package/src/bsdiff/zstd/lib/decompress/zstd_decompress.c +0 -2407
  339. package/src/bsdiff/zstd/lib/decompress/zstd_decompress_block.c +0 -2215
  340. package/src/bsdiff/zstd/lib/decompress/zstd_decompress_block.h +0 -73
  341. package/src/bsdiff/zstd/lib/decompress/zstd_decompress_internal.h +0 -240
  342. package/src/bsdiff/zstd/lib/deprecated/zbuff.h +0 -214
  343. package/src/bsdiff/zstd/lib/deprecated/zbuff_common.c +0 -26
  344. package/src/bsdiff/zstd/lib/deprecated/zbuff_compress.c +0 -167
  345. package/src/bsdiff/zstd/lib/deprecated/zbuff_decompress.c +0 -77
  346. package/src/bsdiff/zstd/lib/dictBuilder/cover.c +0 -1261
  347. package/src/bsdiff/zstd/lib/dictBuilder/cover.h +0 -152
  348. package/src/bsdiff/zstd/lib/dictBuilder/divsufsort.c +0 -1913
  349. package/src/bsdiff/zstd/lib/dictBuilder/divsufsort.h +0 -67
  350. package/src/bsdiff/zstd/lib/dictBuilder/fastcover.c +0 -766
  351. package/src/bsdiff/zstd/lib/dictBuilder/zdict.c +0 -1133
  352. package/src/bsdiff/zstd/lib/dll/example/Makefile +0 -48
  353. package/src/bsdiff/zstd/lib/dll/example/README.md +0 -63
  354. package/src/bsdiff/zstd/lib/dll/example/build_package.bat +0 -20
  355. package/src/bsdiff/zstd/lib/dll/example/fullbench-dll.sln +0 -25
  356. package/src/bsdiff/zstd/lib/dll/example/fullbench-dll.vcxproj +0 -181
  357. package/src/bsdiff/zstd/lib/legacy/zstd_legacy.h +0 -452
  358. package/src/bsdiff/zstd/lib/legacy/zstd_v01.c +0 -2127
  359. package/src/bsdiff/zstd/lib/legacy/zstd_v01.h +0 -94
  360. package/src/bsdiff/zstd/lib/legacy/zstd_v02.c +0 -3465
  361. package/src/bsdiff/zstd/lib/legacy/zstd_v02.h +0 -93
  362. package/src/bsdiff/zstd/lib/legacy/zstd_v03.c +0 -3105
  363. package/src/bsdiff/zstd/lib/legacy/zstd_v03.h +0 -93
  364. package/src/bsdiff/zstd/lib/legacy/zstd_v04.c +0 -3598
  365. package/src/bsdiff/zstd/lib/legacy/zstd_v04.h +0 -142
  366. package/src/bsdiff/zstd/lib/legacy/zstd_v05.c +0 -4005
  367. package/src/bsdiff/zstd/lib/legacy/zstd_v05.h +0 -162
  368. package/src/bsdiff/zstd/lib/legacy/zstd_v06.c +0 -4106
  369. package/src/bsdiff/zstd/lib/legacy/zstd_v06.h +0 -172
  370. package/src/bsdiff/zstd/lib/legacy/zstd_v07.c +0 -4490
  371. package/src/bsdiff/zstd/lib/legacy/zstd_v07.h +0 -187
  372. package/src/bsdiff/zstd/lib/libzstd.mk +0 -237
  373. package/src/bsdiff/zstd/lib/libzstd.pc.in +0 -16
  374. package/src/bsdiff/zstd/lib/module.modulemap +0 -35
  375. package/src/bsdiff/zstd/lib/zdict.h +0 -474
  376. package/src/bsdiff/zstd/lib/zstd.h +0 -3089
  377. package/src/bsdiff/zstd/lib/zstd_errors.h +0 -114
  378. package/src/bsdiff/zstd/programs/BUCK +0 -44
  379. package/src/bsdiff/zstd/programs/Makefile +0 -445
  380. package/src/bsdiff/zstd/programs/README.md +0 -302
  381. package/src/bsdiff/zstd/programs/benchfn.c +0 -256
  382. package/src/bsdiff/zstd/programs/benchfn.h +0 -183
  383. package/src/bsdiff/zstd/programs/benchzstd.c +0 -1264
  384. package/src/bsdiff/zstd/programs/benchzstd.h +0 -198
  385. package/src/bsdiff/zstd/programs/datagen.c +0 -186
  386. package/src/bsdiff/zstd/programs/datagen.h +0 -30
  387. package/src/bsdiff/zstd/programs/dibio.c +0 -440
  388. package/src/bsdiff/zstd/programs/dibio.h +0 -39
  389. package/src/bsdiff/zstd/programs/fileio.c +0 -3470
  390. package/src/bsdiff/zstd/programs/fileio.h +0 -181
  391. package/src/bsdiff/zstd/programs/fileio_asyncio.c +0 -663
  392. package/src/bsdiff/zstd/programs/fileio_asyncio.h +0 -203
  393. package/src/bsdiff/zstd/programs/fileio_common.h +0 -125
  394. package/src/bsdiff/zstd/programs/fileio_types.h +0 -86
  395. package/src/bsdiff/zstd/programs/lorem.c +0 -285
  396. package/src/bsdiff/zstd/programs/lorem.h +0 -32
  397. package/src/bsdiff/zstd/programs/platform.h +0 -218
  398. package/src/bsdiff/zstd/programs/timefn.c +0 -168
  399. package/src/bsdiff/zstd/programs/timefn.h +0 -70
  400. package/src/bsdiff/zstd/programs/util.c +0 -1652
  401. package/src/bsdiff/zstd/programs/util.h +0 -359
  402. package/src/bsdiff/zstd/programs/windres/verrsrc.h +0 -17
  403. package/src/bsdiff/zstd/programs/windres/zstd.rc +0 -51
  404. package/src/bsdiff/zstd/programs/windres/zstd32.res +0 -0
  405. package/src/bsdiff/zstd/programs/windres/zstd64.res +0 -0
  406. package/src/bsdiff/zstd/programs/zstd.1 +0 -566
  407. package/src/bsdiff/zstd/programs/zstd.1.md +0 -695
  408. package/src/bsdiff/zstd/programs/zstdcli.c +0 -1625
  409. package/src/bsdiff/zstd/programs/zstdcli_trace.c +0 -172
  410. package/src/bsdiff/zstd/programs/zstdcli_trace.h +0 -24
  411. package/src/bsdiff/zstd/programs/zstdgrep +0 -134
  412. package/src/bsdiff/zstd/programs/zstdgrep.1 +0 -26
  413. package/src/bsdiff/zstd/programs/zstdgrep.1.md +0 -30
  414. package/src/bsdiff/zstd/programs/zstdless +0 -8
  415. package/src/bsdiff/zstd/programs/zstdless.1 +0 -14
  416. package/src/bsdiff/zstd/programs/zstdless.1.md +0 -16
  417. package/src/bsdiff/zstd/tests/DEPRECATED-test-zstd-speed.py +0 -378
  418. package/src/bsdiff/zstd/tests/Makefile +0 -477
  419. package/src/bsdiff/zstd/tests/README.md +0 -184
  420. package/src/bsdiff/zstd/tests/automated_benchmarking.py +0 -326
  421. package/src/bsdiff/zstd/tests/bigdict.c +0 -128
  422. package/src/bsdiff/zstd/tests/checkTag.c +0 -65
  423. package/src/bsdiff/zstd/tests/check_size.py +0 -31
  424. package/src/bsdiff/zstd/tests/cli-tests/README.md +0 -258
  425. package/src/bsdiff/zstd/tests/cli-tests/basic/args.sh +0 -10
  426. package/src/bsdiff/zstd/tests/cli-tests/basic/args.sh.exit +0 -1
  427. package/src/bsdiff/zstd/tests/cli-tests/basic/args.sh.stderr.glob +0 -28
  428. package/src/bsdiff/zstd/tests/cli-tests/basic/help.sh +0 -10
  429. package/src/bsdiff/zstd/tests/cli-tests/basic/help.sh.stdout.glob +0 -34
  430. package/src/bsdiff/zstd/tests/cli-tests/basic/memlimit.sh +0 -40
  431. package/src/bsdiff/zstd/tests/cli-tests/basic/memlimit.sh.stderr.exact +0 -13
  432. package/src/bsdiff/zstd/tests/cli-tests/basic/memlimit.sh.stdout.exact +0 -13
  433. package/src/bsdiff/zstd/tests/cli-tests/basic/output_dir.sh +0 -7
  434. package/src/bsdiff/zstd/tests/cli-tests/basic/output_dir.sh.stderr.exact +0 -2
  435. package/src/bsdiff/zstd/tests/cli-tests/basic/output_dir.sh.stdout.exact +0 -2
  436. package/src/bsdiff/zstd/tests/cli-tests/basic/version.sh +0 -6
  437. package/src/bsdiff/zstd/tests/cli-tests/basic/version.sh.stdout.glob +0 -2
  438. package/src/bsdiff/zstd/tests/cli-tests/bin/cmp_size +0 -44
  439. package/src/bsdiff/zstd/tests/cli-tests/bin/datagen +0 -3
  440. package/src/bsdiff/zstd/tests/cli-tests/bin/die +0 -4
  441. package/src/bsdiff/zstd/tests/cli-tests/bin/println +0 -2
  442. package/src/bsdiff/zstd/tests/cli-tests/bin/zstd +0 -9
  443. package/src/bsdiff/zstd/tests/cli-tests/bin/zstdgrep +0 -2
  444. package/src/bsdiff/zstd/tests/cli-tests/bin/zstdless +0 -2
  445. package/src/bsdiff/zstd/tests/cli-tests/cltools/setup +0 -6
  446. package/src/bsdiff/zstd/tests/cli-tests/cltools/zstdgrep.sh +0 -8
  447. package/src/bsdiff/zstd/tests/cli-tests/cltools/zstdgrep.sh.exit +0 -1
  448. package/src/bsdiff/zstd/tests/cli-tests/cltools/zstdgrep.sh.stderr.exact +0 -1
  449. package/src/bsdiff/zstd/tests/cli-tests/cltools/zstdgrep.sh.stdout.glob +0 -4
  450. package/src/bsdiff/zstd/tests/cli-tests/cltools/zstdless.sh +0 -10
  451. package/src/bsdiff/zstd/tests/cli-tests/cltools/zstdless.sh.stderr.exact +0 -2
  452. package/src/bsdiff/zstd/tests/cli-tests/cltools/zstdless.sh.stdout.glob +0 -5
  453. package/src/bsdiff/zstd/tests/cli-tests/common/format.sh +0 -19
  454. package/src/bsdiff/zstd/tests/cli-tests/common/mtime.sh +0 -13
  455. package/src/bsdiff/zstd/tests/cli-tests/common/permissions.sh +0 -18
  456. package/src/bsdiff/zstd/tests/cli-tests/common/platform.sh +0 -37
  457. package/src/bsdiff/zstd/tests/cli-tests/compression/adapt.sh +0 -14
  458. package/src/bsdiff/zstd/tests/cli-tests/compression/basic.sh +0 -36
  459. package/src/bsdiff/zstd/tests/cli-tests/compression/compress-literals.sh +0 -10
  460. package/src/bsdiff/zstd/tests/cli-tests/compression/format.sh +0 -16
  461. package/src/bsdiff/zstd/tests/cli-tests/compression/golden.sh +0 -16
  462. package/src/bsdiff/zstd/tests/cli-tests/compression/gzip-compat.sh +0 -17
  463. package/src/bsdiff/zstd/tests/cli-tests/compression/levels.sh +0 -62
  464. package/src/bsdiff/zstd/tests/cli-tests/compression/levels.sh.stderr.exact +0 -69
  465. package/src/bsdiff/zstd/tests/cli-tests/compression/long-distance-matcher.sh +0 -7
  466. package/src/bsdiff/zstd/tests/cli-tests/compression/multi-threaded.sh +0 -15
  467. package/src/bsdiff/zstd/tests/cli-tests/compression/multi-threaded.sh.stderr.exact +0 -11
  468. package/src/bsdiff/zstd/tests/cli-tests/compression/multiple-files.sh +0 -21
  469. package/src/bsdiff/zstd/tests/cli-tests/compression/multiple-files.sh.stdout.exact +0 -12
  470. package/src/bsdiff/zstd/tests/cli-tests/compression/row-match-finder.sh +0 -7
  471. package/src/bsdiff/zstd/tests/cli-tests/compression/setup +0 -7
  472. package/src/bsdiff/zstd/tests/cli-tests/compression/stream-size.sh +0 -7
  473. package/src/bsdiff/zstd/tests/cli-tests/compression/verbose-wlog.sh +0 -11
  474. package/src/bsdiff/zstd/tests/cli-tests/compression/verbose-wlog.sh.stderr.glob +0 -5
  475. package/src/bsdiff/zstd/tests/cli-tests/compression/verbose-wlog.sh.stdout.glob +0 -5
  476. package/src/bsdiff/zstd/tests/cli-tests/compression/window-resize.sh +0 -9
  477. package/src/bsdiff/zstd/tests/cli-tests/compression/window-resize.sh.stderr.ignore +0 -0
  478. package/src/bsdiff/zstd/tests/cli-tests/compression/window-resize.sh.stdout.glob +0 -3
  479. package/src/bsdiff/zstd/tests/cli-tests/decompression/detectErrors.sh +0 -11
  480. package/src/bsdiff/zstd/tests/cli-tests/decompression/golden.sh +0 -7
  481. package/src/bsdiff/zstd/tests/cli-tests/decompression/pass-through.sh +0 -57
  482. package/src/bsdiff/zstd/tests/cli-tests/decompression/pass-through.sh.stderr.exact +0 -11
  483. package/src/bsdiff/zstd/tests/cli-tests/decompression/pass-through.sh.stdout.exact +0 -25
  484. package/src/bsdiff/zstd/tests/cli-tests/dict-builder/empty-input.sh +0 -9
  485. package/src/bsdiff/zstd/tests/cli-tests/dict-builder/empty-input.sh.stderr.exact +0 -1
  486. package/src/bsdiff/zstd/tests/cli-tests/dict-builder/no-inputs.sh +0 -3
  487. package/src/bsdiff/zstd/tests/cli-tests/dict-builder/no-inputs.sh.exit +0 -1
  488. package/src/bsdiff/zstd/tests/cli-tests/dict-builder/no-inputs.sh.stderr.exact +0 -5
  489. package/src/bsdiff/zstd/tests/cli-tests/dictionaries/dictionary-mismatch.sh +0 -29
  490. package/src/bsdiff/zstd/tests/cli-tests/dictionaries/dictionary-mismatch.sh.stderr.exact +0 -7
  491. package/src/bsdiff/zstd/tests/cli-tests/dictionaries/golden.sh +0 -9
  492. package/src/bsdiff/zstd/tests/cli-tests/dictionaries/setup +0 -6
  493. package/src/bsdiff/zstd/tests/cli-tests/dictionaries/setup_once +0 -24
  494. package/src/bsdiff/zstd/tests/cli-tests/file-handling/directory-mirror.sh +0 -49
  495. package/src/bsdiff/zstd/tests/cli-tests/file-handling/directory-mirror.sh.stderr.exact +0 -0
  496. package/src/bsdiff/zstd/tests/cli-tests/file-handling/directory-mirror.sh.stdout.exact +0 -0
  497. package/src/bsdiff/zstd/tests/cli-tests/file-stat/compress-file-to-dir-without-write-perm.sh +0 -12
  498. package/src/bsdiff/zstd/tests/cli-tests/file-stat/compress-file-to-dir-without-write-perm.sh.stderr.exact +0 -26
  499. package/src/bsdiff/zstd/tests/cli-tests/file-stat/compress-file-to-file.sh +0 -9
  500. package/src/bsdiff/zstd/tests/cli-tests/file-stat/compress-file-to-file.sh.stderr.exact +0 -42
  501. package/src/bsdiff/zstd/tests/cli-tests/file-stat/compress-file-to-stdout.sh +0 -8
  502. package/src/bsdiff/zstd/tests/cli-tests/file-stat/compress-file-to-stdout.sh.stderr.exact +0 -24
  503. package/src/bsdiff/zstd/tests/cli-tests/file-stat/compress-stdin-to-file.sh +0 -8
  504. package/src/bsdiff/zstd/tests/cli-tests/file-stat/compress-stdin-to-file.sh.stderr.exact +0 -24
  505. package/src/bsdiff/zstd/tests/cli-tests/file-stat/compress-stdin-to-stdout.sh +0 -8
  506. package/src/bsdiff/zstd/tests/cli-tests/file-stat/compress-stdin-to-stdout.sh.stderr.exact +0 -18
  507. package/src/bsdiff/zstd/tests/cli-tests/file-stat/decompress-file-to-file.sh +0 -8
  508. package/src/bsdiff/zstd/tests/cli-tests/file-stat/decompress-file-to-file.sh.stderr.exact +0 -38
  509. package/src/bsdiff/zstd/tests/cli-tests/file-stat/decompress-file-to-stdout.sh +0 -7
  510. package/src/bsdiff/zstd/tests/cli-tests/file-stat/decompress-file-to-stdout.sh.stderr.exact +0 -18
  511. package/src/bsdiff/zstd/tests/cli-tests/file-stat/decompress-stdin-to-file.sh +0 -7
  512. package/src/bsdiff/zstd/tests/cli-tests/file-stat/decompress-stdin-to-file.sh.stderr.exact +0 -20
  513. package/src/bsdiff/zstd/tests/cli-tests/file-stat/decompress-stdin-to-stdout.sh +0 -7
  514. package/src/bsdiff/zstd/tests/cli-tests/file-stat/decompress-stdin-to-stdout.sh.stderr.exact +0 -14
  515. package/src/bsdiff/zstd/tests/cli-tests/progress/no-progress.sh +0 -46
  516. package/src/bsdiff/zstd/tests/cli-tests/progress/no-progress.sh.stderr.glob +0 -96
  517. package/src/bsdiff/zstd/tests/cli-tests/progress/progress.sh +0 -41
  518. package/src/bsdiff/zstd/tests/cli-tests/progress/progress.sh.stderr.glob +0 -62
  519. package/src/bsdiff/zstd/tests/cli-tests/run.py +0 -731
  520. package/src/bsdiff/zstd/tests/cli-tests/zstd-symlinks/setup +0 -6
  521. package/src/bsdiff/zstd/tests/cli-tests/zstd-symlinks/zstdcat.sh +0 -12
  522. package/src/bsdiff/zstd/tests/cli-tests/zstd-symlinks/zstdcat.sh.stdout.exact +0 -8
  523. package/src/bsdiff/zstd/tests/datagencli.c +0 -149
  524. package/src/bsdiff/zstd/tests/decodecorpus.c +0 -1936
  525. package/src/bsdiff/zstd/tests/dict-files/zero-weight-dict +0 -0
  526. package/src/bsdiff/zstd/tests/external_matchfinder.c +0 -140
  527. package/src/bsdiff/zstd/tests/external_matchfinder.h +0 -39
  528. package/src/bsdiff/zstd/tests/fullbench.c +0 -980
  529. package/src/bsdiff/zstd/tests/fuzz/Makefile +0 -277
  530. package/src/bsdiff/zstd/tests/fuzz/README.md +0 -161
  531. package/src/bsdiff/zstd/tests/fuzz/block_decompress.c +0 -53
  532. package/src/bsdiff/zstd/tests/fuzz/block_round_trip.c +0 -103
  533. package/src/bsdiff/zstd/tests/fuzz/decompress_cross_format.c +0 -130
  534. package/src/bsdiff/zstd/tests/fuzz/decompress_dstSize_tooSmall.c +0 -74
  535. package/src/bsdiff/zstd/tests/fuzz/dictionary_decompress.c +0 -77
  536. package/src/bsdiff/zstd/tests/fuzz/dictionary_loader.c +0 -106
  537. package/src/bsdiff/zstd/tests/fuzz/dictionary_round_trip.c +0 -155
  538. package/src/bsdiff/zstd/tests/fuzz/dictionary_stream_round_trip.c +0 -209
  539. package/src/bsdiff/zstd/tests/fuzz/fse_read_ncount.c +0 -100
  540. package/src/bsdiff/zstd/tests/fuzz/fuzz.h +0 -57
  541. package/src/bsdiff/zstd/tests/fuzz/fuzz.py +0 -911
  542. package/src/bsdiff/zstd/tests/fuzz/fuzz_data_producer.c +0 -95
  543. package/src/bsdiff/zstd/tests/fuzz/fuzz_data_producer.h +0 -66
  544. package/src/bsdiff/zstd/tests/fuzz/fuzz_helpers.c +0 -48
  545. package/src/bsdiff/zstd/tests/fuzz/fuzz_helpers.h +0 -81
  546. package/src/bsdiff/zstd/tests/fuzz/fuzz_third_party_seq_prod.h +0 -116
  547. package/src/bsdiff/zstd/tests/fuzz/generate_sequences.c +0 -88
  548. package/src/bsdiff/zstd/tests/fuzz/huf_decompress.c +0 -68
  549. package/src/bsdiff/zstd/tests/fuzz/huf_round_trip.c +0 -137
  550. package/src/bsdiff/zstd/tests/fuzz/raw_dictionary_round_trip.c +0 -119
  551. package/src/bsdiff/zstd/tests/fuzz/regression_driver.c +0 -90
  552. package/src/bsdiff/zstd/tests/fuzz/seekable_roundtrip.c +0 -88
  553. package/src/bsdiff/zstd/tests/fuzz/seq_prod_fuzz_example/Makefile +0 -16
  554. package/src/bsdiff/zstd/tests/fuzz/seq_prod_fuzz_example/README.md +0 -12
  555. package/src/bsdiff/zstd/tests/fuzz/seq_prod_fuzz_example/example_seq_prod.c +0 -52
  556. package/src/bsdiff/zstd/tests/fuzz/sequence_compression_api.c +0 -381
  557. package/src/bsdiff/zstd/tests/fuzz/simple_compress.c +0 -60
  558. package/src/bsdiff/zstd/tests/fuzz/simple_decompress.c +0 -59
  559. package/src/bsdiff/zstd/tests/fuzz/simple_round_trip.c +0 -182
  560. package/src/bsdiff/zstd/tests/fuzz/stream_decompress.c +0 -119
  561. package/src/bsdiff/zstd/tests/fuzz/stream_round_trip.c +0 -218
  562. package/src/bsdiff/zstd/tests/fuzz/zstd_frame_info.c +0 -43
  563. package/src/bsdiff/zstd/tests/fuzz/zstd_helpers.c +0 -207
  564. package/src/bsdiff/zstd/tests/fuzz/zstd_helpers.h +0 -56
  565. package/src/bsdiff/zstd/tests/fuzzer.c +0 -4933
  566. package/src/bsdiff/zstd/tests/golden-compression/PR-3517-block-splitter-corruption-test +0 -1
  567. package/src/bsdiff/zstd/tests/golden-compression/http +0 -1
  568. package/src/bsdiff/zstd/tests/golden-compression/huffman-compressed-larger +0 -0
  569. package/src/bsdiff/zstd/tests/golden-compression/large-literal-and-match-lengths +0 -0
  570. package/src/bsdiff/zstd/tests/golden-decompression/block-128k.zst +0 -0
  571. package/src/bsdiff/zstd/tests/golden-decompression/empty-block.zst +0 -0
  572. package/src/bsdiff/zstd/tests/golden-decompression/rle-first-block.zst +0 -0
  573. package/src/bsdiff/zstd/tests/golden-decompression/zeroSeq_2B.zst +0 -0
  574. package/src/bsdiff/zstd/tests/golden-decompression-errors/off0.bin.zst +0 -0
  575. package/src/bsdiff/zstd/tests/golden-decompression-errors/zeroSeq_extraneous.zst +0 -0
  576. package/src/bsdiff/zstd/tests/golden-dictionaries/http-dict-missing-symbols +0 -0
  577. package/src/bsdiff/zstd/tests/gzip/Makefile +0 -45
  578. package/src/bsdiff/zstd/tests/gzip/gzip-env.sh +0 -46
  579. package/src/bsdiff/zstd/tests/gzip/helin-segv.sh +0 -31
  580. package/src/bsdiff/zstd/tests/gzip/help-version.sh +0 -270
  581. package/src/bsdiff/zstd/tests/gzip/hufts-segv.gz +0 -0
  582. package/src/bsdiff/zstd/tests/gzip/hufts.sh +0 -34
  583. package/src/bsdiff/zstd/tests/gzip/init.cfg +0 -5
  584. package/src/bsdiff/zstd/tests/gzip/init.sh +0 -616
  585. package/src/bsdiff/zstd/tests/gzip/keep.sh +0 -51
  586. package/src/bsdiff/zstd/tests/gzip/list.sh +0 -31
  587. package/src/bsdiff/zstd/tests/gzip/memcpy-abuse.sh +0 -34
  588. package/src/bsdiff/zstd/tests/gzip/mixed.sh +0 -68
  589. package/src/bsdiff/zstd/tests/gzip/null-suffix-clobber.sh +0 -35
  590. package/src/bsdiff/zstd/tests/gzip/stdin.sh +0 -31
  591. package/src/bsdiff/zstd/tests/gzip/test-driver.sh +0 -150
  592. package/src/bsdiff/zstd/tests/gzip/trailing-nul.sh +0 -37
  593. package/src/bsdiff/zstd/tests/gzip/unpack-invalid.sh +0 -36
  594. package/src/bsdiff/zstd/tests/gzip/z-suffix.sh +0 -30
  595. package/src/bsdiff/zstd/tests/gzip/zdiff.sh +0 -48
  596. package/src/bsdiff/zstd/tests/gzip/zgrep-context.sh +0 -47
  597. package/src/bsdiff/zstd/tests/gzip/zgrep-f.sh +0 -43
  598. package/src/bsdiff/zstd/tests/gzip/zgrep-signal.sh +0 -64
  599. package/src/bsdiff/zstd/tests/gzip/znew-k.sh +0 -40
  600. package/src/bsdiff/zstd/tests/invalidDictionaries.c +0 -61
  601. package/src/bsdiff/zstd/tests/legacy.c +0 -260
  602. package/src/bsdiff/zstd/tests/libzstd_builds.sh +0 -104
  603. package/src/bsdiff/zstd/tests/longmatch.c +0 -102
  604. package/src/bsdiff/zstd/tests/loremOut.c +0 -50
  605. package/src/bsdiff/zstd/tests/loremOut.h +0 -15
  606. package/src/bsdiff/zstd/tests/paramgrill.c +0 -2966
  607. package/src/bsdiff/zstd/tests/playTests.sh +0 -1928
  608. package/src/bsdiff/zstd/tests/poolTests.c +0 -271
  609. package/src/bsdiff/zstd/tests/rateLimiter.py +0 -41
  610. package/src/bsdiff/zstd/tests/regression/Makefile +0 -60
  611. package/src/bsdiff/zstd/tests/regression/README.md +0 -28
  612. package/src/bsdiff/zstd/tests/regression/config.c +0 -404
  613. package/src/bsdiff/zstd/tests/regression/config.h +0 -91
  614. package/src/bsdiff/zstd/tests/regression/data.c +0 -631
  615. package/src/bsdiff/zstd/tests/regression/data.h +0 -121
  616. package/src/bsdiff/zstd/tests/regression/levels.h +0 -59
  617. package/src/bsdiff/zstd/tests/regression/method.c +0 -701
  618. package/src/bsdiff/zstd/tests/regression/method.h +0 -65
  619. package/src/bsdiff/zstd/tests/regression/result.c +0 -28
  620. package/src/bsdiff/zstd/tests/regression/result.h +0 -103
  621. package/src/bsdiff/zstd/tests/regression/results.csv +0 -1480
  622. package/src/bsdiff/zstd/tests/regression/test.c +0 -362
  623. package/src/bsdiff/zstd/tests/roundTripCrash.c +0 -241
  624. package/src/bsdiff/zstd/tests/seqgen.c +0 -260
  625. package/src/bsdiff/zstd/tests/seqgen.h +0 -58
  626. package/src/bsdiff/zstd/tests/test-license.py +0 -156
  627. package/src/bsdiff/zstd/tests/test-variants.sh +0 -115
  628. package/src/bsdiff/zstd/tests/test-zstd-versions.py +0 -308
  629. package/src/bsdiff/zstd/tests/zstreamtest.c +0 -3407
  630. package/src/bsdiff/zstd/zlibWrapper/BUCK +0 -22
  631. package/src/bsdiff/zstd/zlibWrapper/Makefile +0 -120
  632. package/src/bsdiff/zstd/zlibWrapper/README.md +0 -163
  633. package/src/bsdiff/zstd/zlibWrapper/examples/example.c +0 -598
  634. package/src/bsdiff/zstd/zlibWrapper/examples/example_original.c +0 -599
  635. package/src/bsdiff/zstd/zlibWrapper/examples/fitblk.c +0 -254
  636. package/src/bsdiff/zstd/zlibWrapper/examples/fitblk_original.c +0 -233
  637. package/src/bsdiff/zstd/zlibWrapper/examples/minigzip.c +0 -605
  638. package/src/bsdiff/zstd/zlibWrapper/examples/zwrapbench.c +0 -1018
  639. package/src/bsdiff/zstd/zlibWrapper/gzclose.c +0 -26
  640. package/src/bsdiff/zstd/zlibWrapper/gzcompatibility.h +0 -68
  641. package/src/bsdiff/zstd/zlibWrapper/gzguts.h +0 -229
  642. package/src/bsdiff/zstd/zlibWrapper/gzlib.c +0 -587
  643. package/src/bsdiff/zstd/zlibWrapper/gzread.c +0 -637
  644. package/src/bsdiff/zstd/zlibWrapper/gzwrite.c +0 -631
  645. package/src/bsdiff/zstd/zlibWrapper/zstd_zlibwrapper.c +0 -1200
  646. package/src/bsdiff/zstd/zlibWrapper/zstd_zlibwrapper.h +0 -91
  647. package/src/objc/build/objcWrapper.o +0 -0
  648. package/src/objc/objcWrapper.m +0 -1380
  649. package/src/zig/build/index.js +0 -782
  650. package/src/zig/build/libObjcWrapper.a +0 -0
  651. package/src/zig/build.zig +0 -29
  652. package/src/zig/macos/application.zig +0 -6
  653. package/src/zig/macos/objc.zig +0 -123
  654. package/src/zig/macos/tray.zig +0 -102
  655. package/src/zig/macos/webview.zig +0 -693
  656. package/src/zig/macos/window.zig +0 -189
  657. package/src/zig/main.zig +0 -16
  658. package/src/zig/rpc/pipesin.zig +0 -202
  659. package/src/zig/rpc/rpc.zig +0 -19
  660. package/src/zig/rpc/schema/handlers.zig +0 -402
  661. package/src/zig/rpc/schema/request.zig +0 -59
  662. package/src/zig/rpc/schema/schema.zig +0 -412
  663. package/src/zig/rpc/stdin.zig +0 -112
  664. package/src/zig/rpc/stdout.zig +0 -106
  665. package/src/zig/rpc/types.zig +0 -41
  666. package/src/zig/utils.zig +0 -49
  667. package/src/zig/zig-out/bin/webview +0 -0
@@ -1,1380 +0,0 @@
1
- #import <WebKit/WebKit.h>
2
- #import <objc/runtime.h>
3
- #import <Cocoa/Cocoa.h>
4
- #import <Foundation/Foundation.h>
5
- #import <CommonCrypto/CommonCrypto.h>
6
-
7
- // views:// schema handler
8
-
9
- typedef struct {
10
- const char *mimeType;
11
- const char *fileContents;
12
- size_t len;
13
- void *opaquePointer;
14
- } FileResponse;
15
-
16
- // Define callback types for starting and stopping URL scheme tasks
17
- typedef FileResponse (*zigStartURLSchemeTaskCallback)(uint32_t webviewId, const char* url, const char* body);
18
-
19
- @interface MyURLSchemeHandler : NSObject <WKURLSchemeHandler>
20
- // todo: rename fileLoader to zigContentLoader or zigResponseLoader
21
- @property (nonatomic, assign) zigStartURLSchemeTaskCallback fileLoader;
22
- @property (nonatomic, assign) uint32_t webviewId;
23
- @end
24
-
25
- @implementation MyURLSchemeHandler
26
-
27
- - (void)webView:(WKWebView *)webView startURLSchemeTask:(id<WKURLSchemeTask>)urlSchemeTask {
28
- NSURL *url = urlSchemeTask.request.URL;
29
- NSData *bodyData = urlSchemeTask.request.HTTPBody;
30
- NSString *bodyString = [[NSString alloc] initWithData:bodyData encoding:NSUTF8StringEncoding];
31
-
32
- // todo: the zig handler should return the file to here, and objc can send it back to the webview
33
- if (self.fileLoader) {
34
- FileResponse fileResponse = self.fileLoader(self.webviewId, url.absoluteString.UTF8String, bodyString.UTF8String);
35
- // Determine MIME type from the response, or default if null
36
- NSString *mimeType = fileResponse.mimeType ? [NSString stringWithUTF8String:fileResponse.mimeType] : @"application/octet-stream";
37
-
38
-
39
- if ([mimeType isEqualToString:@"screenshot"]) {
40
- // Note: for the screenshot api currently we just use zig to get a handle to the
41
- // requested webview that we want to snapshot. We take the snapshot here and
42
- // resolve the url request here.
43
-
44
- WKSnapshotConfiguration *snapshotConfig = [[WKSnapshotConfiguration alloc] init];
45
- WKWebView *targetWebview = (__bridge WKWebView *)fileResponse.opaquePointer;
46
-
47
- // Capture the snapshot
48
- [targetWebview takeSnapshotWithConfiguration:snapshotConfig completionHandler:^(NSImage *snapshotImage, NSError *error) {
49
- if (error) {
50
- NSLog(@"Error capturing snapshot: %@", error);
51
- return;
52
- }
53
- // bmp - twice as fast as jpg which is twice as fast as png
54
- NSDictionary *bmpProperties = @{NSImageCompressionFactor: @1.0}; // Adjust compression factor as needed
55
- NSBitmapImageRep *imgRepbmp = [[NSBitmapImageRep alloc] initWithData:[snapshotImage TIFFRepresentation]];
56
- NSData *imgData = [imgRepbmp representationUsingType:NSBitmapImageFileTypeBMP properties:bmpProperties];
57
-
58
-
59
-
60
- // Create a response - you might need to adjust the MIME type
61
- NSURLResponse *response = [[NSURLResponse alloc] initWithURL:url
62
- // Webkit will try guess the mimetype based on the file extension. supports common file types https://github.com/WebKit/WebKit/blob/a78127adb38a402b5d0fe6b17367aba32a38eb22/Source/WebCore/platform/playstation/MIMETypeRegistryPlayStation.cpp#L34-L55
63
- // If/when we need to support more file types, we can implement that in zig cross-platform and allow extending with more
64
- // bun also has comprehensive mimetype detection written in zig that could be used but increases the binary size
65
- MIMEType:@"image/bmp"
66
- expectedContentLength:imgData.length
67
- textEncodingName:nil];
68
-
69
-
70
- // Inform the urlSchemeTask of the response
71
- [urlSchemeTask didReceiveResponse:response];
72
-
73
- // Send the data
74
- [urlSchemeTask didReceiveData:imgData];
75
-
76
- // Complete the task
77
- [urlSchemeTask didFinish];
78
- // how to send the fileContents back to the webview?
79
- }];
80
- } else {
81
- NSData *data = [NSData dataWithBytes:fileResponse.fileContents length:fileResponse.len];
82
-
83
- // Create a response - you might need to adjust the MIME type
84
- NSURLResponse *response = [[NSURLResponse alloc] initWithURL:url
85
- // Webkit will try guess the mimetype based on the file extension. supports common file types https://github.com/WebKit/WebKit/blob/a78127adb38a402b5d0fe6b17367aba32a38eb22/Source/WebCore/platform/playstation/MIMETypeRegistryPlayStation.cpp#L34-L55
86
- // If/when we need to support more file types, we can implement that in zig cross-platform and allow extending with more
87
- // bun also has comprehensive mimetype detection written in zig that could be used but increases the binary size
88
- MIMEType:mimeType
89
- expectedContentLength:data.length
90
- textEncodingName:nil];
91
-
92
- // Inform the urlSchemeTask of the response
93
- [urlSchemeTask didReceiveResponse:response];
94
-
95
- // Send the data
96
- [urlSchemeTask didReceiveData:data];
97
-
98
- // Complete the task
99
- [urlSchemeTask didFinish];
100
- // how to send the fileContents back to the webview?
101
- }
102
- }
103
- }
104
-
105
- - (void)webView:(WKWebView *)webView stopURLSchemeTask:(id<WKURLSchemeTask>)urlSchemeTask {
106
- NSURL *url = urlSchemeTask.request.URL;
107
- NSLog(@"Stopping URL scheme task for URL: %@", url);
108
- }
109
-
110
- @end
111
-
112
- // generic utils
113
-
114
- // manually retain and release objects so they don't get deallocated
115
- // Function to retain any Objective-C object
116
- // Note: retainObj / releaseObj increments and decrements the retain count of the object
117
- // prefer using objc_setAssociatedObject to store objects in other objects
118
- // this lets arc count that association as a reference and auto-cleanup when it's no longer needed
119
- void retainObjCObject(id objcObject) {
120
- CFRetain((__bridge CFTypeRef)objcObject);
121
- }
122
-
123
- // Function to release any Objective-C object
124
- void releaseObjCObject(id objcObject) {
125
- CFRelease((__bridge CFTypeRef)objcObject);
126
- }
127
-
128
- // mask utils
129
- typedef struct {
130
- BOOL Borderless;
131
- BOOL Titled;
132
- BOOL Closable;
133
- BOOL Miniaturizable;
134
- BOOL Resizable;
135
- BOOL UnifiedTitleAndToolbar;
136
- BOOL FullScreen;
137
- BOOL FullSizeContentView;
138
- BOOL UtilityWindow;
139
- BOOL DocModalWindow;
140
- BOOL NonactivatingPanel;
141
- BOOL HUDWindow;
142
- } WindowStyleMaskOptions;
143
-
144
- NSUInteger getNSWindowStyleMask(WindowStyleMaskOptions options) {
145
- NSUInteger mask = 0;
146
- if (options.Borderless) {
147
- mask |= NSWindowStyleMaskBorderless;
148
- }
149
- if (options.Titled) {
150
- mask |= NSWindowStyleMaskTitled;
151
- }
152
- if (options.Closable) {
153
- mask |= NSWindowStyleMaskClosable;
154
- }
155
- if (options.Miniaturizable) {
156
- mask |= NSWindowStyleMaskMiniaturizable;
157
- }
158
- if (options.Resizable) {
159
- mask |= NSWindowStyleMaskResizable;
160
- }
161
- if (options.UnifiedTitleAndToolbar) {
162
- mask |= NSWindowStyleMaskUnifiedTitleAndToolbar;
163
- }
164
- if (options.FullScreen) {
165
- mask |= NSWindowStyleMaskFullScreen;
166
- }
167
- if (options.FullSizeContentView) {
168
- mask |= NSWindowStyleMaskFullSizeContentView;
169
- }
170
- if (options.UtilityWindow) {
171
- mask |= NSWindowStyleMaskUtilityWindow;
172
- }
173
- if (options.DocModalWindow) {
174
- mask |= NSWindowStyleMaskDocModalWindow;
175
- }
176
- if (options.NonactivatingPanel) {
177
- mask |= NSWindowStyleMaskNonactivatingPanel;
178
- }
179
- if (options.HUDWindow) {
180
- mask |= NSWindowStyleMaskHUDWindow;
181
- }
182
-
183
- return mask;
184
- }
185
-
186
- // application
187
-
188
- @interface AppDelegate : NSObject <NSApplicationDelegate>
189
- @end
190
-
191
- @implementation AppDelegate
192
-
193
- - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
194
- NSLog(@"Intercepting application termination");
195
- // todo: implement a way to cancel sudden termination from bun
196
- // in order to allow for cleanup
197
- // return NSTerminateCancel;
198
- return NSTerminateNow;
199
- }
200
-
201
- @end
202
-
203
-
204
- void runNSApplication() {
205
-
206
- NSApplication *app = [NSApplication sharedApplication];
207
- AppDelegate *delegate = [[AppDelegate alloc] init];
208
- [app setDelegate:delegate];
209
-
210
- retainObjCObject(delegate);
211
-
212
- [app run];
213
-
214
- }
215
-
216
- // cursor
217
-
218
- // Note: WkWebviews are all in different threads and calling mouse cursor methods individually
219
- // Regardless of layering they will often come in out of order
220
- // Regardless of trying to stop propagation of native mousemove events they will still be called
221
- // Because of the way it checks the current NSApp cursor it only calls set when it's different from the one it wants
222
- // Because it's delayed it can't play off the sequence of wkwebkits handling the cursor within a single round trip
223
- // https://github.com/WebKit/WebKit/blob/579f828a4c55913c59cc26a9e6e316e6cf40a45b/Source/WebKit/UIProcess/mac/PageClientImplMac.mm#L324
224
- // Our best hope of smoothing out the cursor wiggle when having layered wkwebviews (like <electrobun-webview> elements)
225
- // is to keep track of the last 20 cursor sets. set the most recent non-arrow one. This still causes a flicker
226
- // every 20 or so sets which is smooth enough to not look super janky, but often enough that the cursor still feels responsive
227
- // I am disgusted by this.
228
-
229
- NSMutableArray<NSCursor *> *recentCursors;
230
- const NSInteger maxCursorHistory = 20;
231
-
232
- @implementation NSCursor (Swizzling)
233
-
234
- + (void)load {
235
- static dispatch_once_t onceToken;
236
- dispatch_once(&onceToken, ^{
237
- recentCursors = [NSMutableArray array];
238
- Class class = [self class];
239
-
240
- SEL originalSelector = @selector(set);
241
- SEL swizzledSelector = @selector(swizzled_set);
242
-
243
- Method originalMethod = class_getInstanceMethod(class, originalSelector);
244
- Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
245
-
246
- BOOL didAddMethod = class_addMethod(class,
247
- originalSelector,
248
- method_getImplementation(swizzledMethod),
249
- method_getTypeEncoding(swizzledMethod));
250
-
251
- if (didAddMethod) {
252
- class_replaceMethod(class,
253
- swizzledSelector,
254
- method_getImplementation(originalMethod),
255
- method_getTypeEncoding(originalMethod));
256
- } else {
257
- method_exchangeImplementations(originalMethod, swizzledMethod);
258
- }
259
- });
260
- }
261
-
262
- - (void)swizzled_set {
263
- [self updateRecentCursors:self];
264
-
265
- // todo: if there's only one webivew then set the cursor and skip everything else
266
- // todo: need to track which window is the last one to set the cursor, can maybe track
267
- // via mousemove events
268
-
269
- NSCursor *nonArrayCursorToSet = [self mostRecentNonArrowCursor];
270
- NSCursor *cursorToSet;
271
-
272
- // todo: if the latest cursor is normal, and te nonArrayCursorToSet is not
273
- // check to see if there are two webviews at this mouse location
274
- // so when moving outside of the webviewtag it resets immediately.
275
- // set the cursor and reset the recentNonArrowCursors
276
-
277
- if (nonArrayCursorToSet) {
278
- cursorToSet = nonArrayCursorToSet;
279
- } else {
280
- cursorToSet = [NSCursor arrowCursor];
281
- }
282
-
283
- [cursorToSet swizzled_set];
284
- }
285
-
286
- - (void)updateRecentCursors:(NSCursor *)cursor {
287
- if (recentCursors.count >= maxCursorHistory) {
288
- [recentCursors removeObjectAtIndex:0];
289
- }
290
-
291
- [recentCursors addObject:cursor];
292
- }
293
-
294
- - (NSCursor *)mostRecentNonArrowCursor {
295
- for (NSCursor *cursor in [recentCursors reverseObjectEnumerator]) {
296
- if (cursor != [NSCursor arrowCursor]) {
297
- return cursor;
298
- }
299
- }
300
- return nil;
301
- }
302
-
303
- @end
304
-
305
-
306
- // WKWebView
307
-
308
- NSUUID *UUIDFromString(NSString *string) {
309
- // Create a SHA-256 hash of the string
310
- unsigned char hash[CC_SHA256_DIGEST_LENGTH];
311
- CC_SHA256(string.UTF8String, (CC_LONG)strlen(string.UTF8String), hash);
312
-
313
- // Construct the UUID from the first 16 bytes of the hash
314
- uuid_t uuid;
315
- memcpy(uuid, hash, sizeof(uuid));
316
-
317
- // Create the NSUUID from the UUID bytes
318
- NSUUID *uuidObject = [[NSUUID alloc] initWithUUIDBytes:uuid];
319
- return uuidObject;
320
- }
321
-
322
- WKWebsiteDataStore* createDataStoreForPartition(const char* partitionIdentifier) {
323
- NSString *identifier = [NSString stringWithUTF8String:partitionIdentifier];
324
-
325
- if ([identifier hasPrefix:@"persist:"]) {
326
- // Create or retrieve a persistent data store with the given identifier
327
- identifier = [identifier substringFromIndex:8]; // Remove the "persist:" prefix
328
- // We use a hash function (SHA256) to predictably generate a UUID from a string
329
- // so we don't have to store the UUIDs anywhere
330
- NSUUID *uuid = UUIDFromString(identifier);
331
- if (uuid) {
332
- return [WKWebsiteDataStore dataStoreForIdentifier:uuid];
333
- } else {
334
- NSLog(@"Invalid UUID for identifier: %@", identifier);
335
- return [WKWebsiteDataStore defaultDataStore]; // Fall back to default data store
336
- }
337
- } else {
338
- // Create a non-persistent data store
339
- return [WKWebsiteDataStore nonPersistentDataStore];
340
- }
341
- }
342
-
343
- // custom WKWebView that allows mouse events to pass through
344
- @interface TransparentWKWebView : WKWebView
345
-
346
- @property (nonatomic, assign) BOOL isMousePassthroughEnabled;
347
-
348
- @end
349
- @implementation TransparentWKWebView
350
-
351
- - (NSView *)hitTest:(NSPoint)point {
352
- if (self.isMousePassthroughEnabled) {
353
- return nil; // Pass through all mouse events
354
- }
355
- return [super hitTest:point];
356
- }
357
-
358
- @end
359
-
360
-
361
- WKWebView* createAndReturnWKWebView(uint32_t webviewId, NSRect frame, zigStartURLSchemeTaskCallback assetFileLoader, bool autoResize, const char *partitionIdentifier) {
362
- // Create a default WKWebViewConfiguration
363
- WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
364
-
365
- // wire up partition
366
- configuration.websiteDataStore = createDataStoreForPartition(partitionIdentifier);
367
-
368
- // wire up views:// schema handler
369
- MyURLSchemeHandler *assetSchemeHandler = [[MyURLSchemeHandler alloc] init];
370
- assetSchemeHandler.fileLoader = assetFileLoader;
371
- assetSchemeHandler.webviewId = webviewId;
372
-
373
- // fullscreen settings
374
- [configuration.preferences setValue:@YES forKey:@"elementFullscreenEnabled"];
375
-
376
- // Note: Keep "views" in sync with views:// in webview.zig
377
- [configuration setURLSchemeHandler:assetSchemeHandler forURLScheme:@"views"];
378
- objc_setAssociatedObject(configuration, "assetSchemeHandler", assetSchemeHandler, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
379
-
380
- // todo: remove - we're not using this anymore
381
- MyURLSchemeHandler *httpsSchemeHandler = [[MyURLSchemeHandler alloc] init];
382
-
383
- httpsSchemeHandler.webviewId = webviewId;
384
-
385
- [configuration setURLSchemeHandler:httpsSchemeHandler forURLScheme:@"remote"];
386
- objc_setAssociatedObject(configuration, "httpsSchemeHandler", httpsSchemeHandler, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
387
-
388
- // open devtools
389
- // Enable Developer Extras (right click to inspect element)
390
- [configuration.preferences setValue:@YES forKey:@"developerExtrasEnabled"];
391
-
392
- // Allocate and initialize the WKWebView
393
- TransparentWKWebView *webView = [[TransparentWKWebView alloc] initWithFrame:frame configuration:configuration];
394
-
395
- // Note: This makes webview have a transparent background by default.
396
- // todo: consider making this configurable during webview creation and/or
397
- // adding a toggle function for it.
398
- [webView setValue:@NO forKey:@"drawsBackground"];
399
- webView.layer.backgroundColor = [[NSColor clearColor] CGColor];
400
- webView.layer.opaque = NO;
401
-
402
- // Since all wkwebviews are children of a generic NSView we need to tell them to
403
- // auto size with the window.
404
- if (autoResize) {
405
- webView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
406
- }
407
-
408
- retainObjCObject(webView);
409
- // Perform any additional setup here
410
- return webView;
411
- }
412
-
413
- void loadURLInWebView(WKWebView *webView, const char *urlString) {
414
- NSString *urlNSString = [NSString stringWithUTF8String:urlString];
415
- NSURL *url = [NSURL URLWithString:urlNSString];
416
- NSURLRequest *request = [NSURLRequest requestWithURL:url];
417
- [webView loadRequest:request];
418
- }
419
-
420
- void loadHTMLInWebView(WKWebView *webView, const char *htmlString) {
421
- NSString *htmlNSString = [NSString stringWithUTF8String:htmlString];
422
- NSURL *baseURL = [NSURL URLWithString:@"file://"];
423
- [webView loadHTMLString:htmlNSString baseURL:baseURL];
424
- }
425
-
426
- void webviewTagGoBack(WKWebView *webView) {
427
- [webView goBack];
428
- }
429
- void webviewTagGoForward(WKWebView *webView) {
430
- [webView goForward];
431
- }
432
- void webviewTagReload(WKWebView *webView) {
433
- [webView reload];
434
- }
435
-
436
- void webviewRemove(WKWebView *webView) {
437
- [webView stopLoading];
438
- [webView removeFromSuperview];
439
-
440
- webView.navigationDelegate = nil;
441
- webView.UIDelegate = nil;
442
-
443
- [webView evaluateJavaScript:@"document.body.innerHTML='';" completionHandler:nil];
444
-
445
- releaseObjCObject(webView);
446
- }
447
-
448
- void invokeDecisionHandler(void (^decisionHandler)(WKNavigationActionPolicy), WKNavigationActionPolicy policy) {
449
- if (decisionHandler != NULL) {
450
- decisionHandler(policy);
451
- }
452
- }
453
-
454
- const char* getUrlFromNavigationAction(WKNavigationAction *navigationAction) {
455
- NSURLRequest *request = navigationAction.request;
456
- NSURL *url = request.URL;
457
- return url.absoluteString.UTF8String;
458
- }
459
-
460
- const char* getBodyFromScriptMessage(WKScriptMessage *message) {
461
- NSString *body = message.body;
462
- return body.UTF8String;
463
- }
464
-
465
- void evaluateJavaScriptWithNoCompletion(WKWebView *webView, const char *jsString) {
466
- NSString *javaScript = [NSString stringWithUTF8String:jsString];
467
- [webView evaluateJavaScript:javaScript completionHandler:nil];
468
- }
469
-
470
- typedef void (*callAsyncJavascriptCompletionHandler)(const char *messageId, uint32_t webviewId, uint32_t hostWebviewId, const char *responseJSON);
471
-
472
- void callAsyncJavaScript(const char *messageId, WKWebView *webView, const char *jsString, uint32_t webviewId, uint32_t hostWebviewId, callAsyncJavascriptCompletionHandler callback) {
473
- NSString *javaScript = [NSString stringWithUTF8String:jsString];
474
- NSDictionary *arguments = @{};
475
-
476
- // todo: let dev specify the content world and the frame
477
- [webView callAsyncJavaScript:javaScript arguments:arguments inFrame:nil inContentWorld:WKContentWorld.pageWorld completionHandler:^(id result, NSError *error) {
478
- NSError *jsonError;
479
- NSData *jsonData;
480
-
481
- if (error != nil) {
482
- jsonData = [NSJSONSerialization dataWithJSONObject:@{@"error": error.localizedDescription} options:0 error:&jsonError];
483
- } else {
484
- if (result == nil) {
485
- jsonData = [NSJSONSerialization dataWithJSONObject:@{@"result": [NSNull null]} options:0 error:&jsonError];
486
- } else if ([NSJSONSerialization isValidJSONObject:result]) {
487
- jsonData = [NSJSONSerialization dataWithJSONObject:result options:0 error:&jsonError];
488
- } else {
489
- jsonData = [NSJSONSerialization dataWithJSONObject:@{@"result": [result description]} options:0 error:&jsonError];
490
- }
491
-
492
- if (jsonError) {
493
- jsonData = [NSJSONSerialization dataWithJSONObject:@{@"error": jsonError.localizedDescription} options:0 error:&jsonError];
494
- }
495
- }
496
-
497
- NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
498
- callback(messageId, webviewId, hostWebviewId, jsonString.UTF8String);
499
- }];
500
- }
501
-
502
- void* getNilValue() {
503
- return NULL;
504
- }
505
-
506
- void addPreloadScriptToWebView(WKWebView *webView, const char *scriptContent, BOOL forMainFrameOnly) {
507
- // Create a WKUserScript object with the provided script content
508
- // Injection time is set to atDocumentStart to ensure it runs before the page content loads
509
- WKUserScript *userScript = [[WKUserScript alloc] initWithSource:[NSString stringWithUTF8String:scriptContent]
510
- injectionTime:WKUserScriptInjectionTimeAtDocumentStart
511
- forMainFrameOnly:forMainFrameOnly];
512
-
513
- // Add the user script to the content controller
514
- [webView.configuration.userContentController addUserScript:userScript];
515
- }
516
-
517
-
518
- // This adds a commend with a unique script identifier to the user script, and removes any existing ones with that identifier
519
- // This is useful for cases where you want to change an existing user script during the lifetime of a webview
520
- void updatePreloadScriptToWebView(WKWebView *webView, const char *scriptIdentifier, const char *scriptContent, BOOL forMainFrameOnly) {
521
- WKUserContentController *contentController = webView.configuration.userContentController;
522
-
523
- // Prepare the script identifier as a comment
524
- NSString *identifierComment = [NSString stringWithFormat:@"// %@\n", [NSString stringWithUTF8String:scriptIdentifier]];
525
- NSString *newScriptSource = [identifierComment stringByAppendingString:[NSString stringWithUTF8String:scriptContent]];
526
-
527
- // Store existing scripts except the one to be updated
528
- NSMutableArray *newScripts = [NSMutableArray array];
529
- for (WKUserScript *userScript in contentController.userScripts) {
530
- if (![userScript.source containsString:identifierComment]) {
531
- [newScripts addObject:userScript];
532
- }
533
- }
534
-
535
- // Clear all scripts
536
- [contentController removeAllUserScripts];
537
-
538
- // Add back the non-updated scripts
539
- for (WKUserScript *userScript in newScripts) {
540
- [contentController addUserScript:userScript];
541
- }
542
-
543
- // Add the new user script
544
- WKUserScript *newUserScript = [[WKUserScript alloc] initWithSource:newScriptSource
545
- injectionTime:WKUserScriptInjectionTimeAtDocumentStart
546
- forMainFrameOnly:forMainFrameOnly];
547
- [contentController addUserScript:newUserScript];
548
- }
549
-
550
- BOOL webviewCanGoBack(WKWebView *webView) {
551
- return [webView canGoBack];
552
- }
553
-
554
- BOOL webviewCanGoForward(WKWebView *webView) {
555
- return [webView canGoForward];
556
- }
557
-
558
- // NSWindow
559
- NSScreen *getPrimaryScreen() {
560
- NSArray *screens = [NSScreen screens];
561
- return screens[0];
562
- }
563
-
564
- NSRect getWindowBounds(NSWindow *window) {
565
- NSView *contentView = [window contentView];
566
- return [contentView bounds];
567
- }
568
-
569
- typedef void (*WindowCloseHandler)(uint32_t windowId);
570
- typedef void (*WindowMoveHandler)(uint32_t windowId, CGFloat x, CGFloat y);
571
- typedef void (*WindowResizeHandler)(uint32_t windowId, CGFloat x, CGFloat y, CGFloat width, CGFloat height);
572
-
573
- @interface WindowDelegate : NSObject <NSWindowDelegate>
574
- @property (nonatomic, assign) WindowCloseHandler closeHandler;
575
- @property (nonatomic, assign) WindowMoveHandler moveHandler;
576
- @property (nonatomic, assign) WindowResizeHandler resizeHandler;
577
- @property (nonatomic, assign) uint32_t windowId;
578
- @end
579
-
580
- @implementation WindowDelegate
581
- - (BOOL)windowShouldClose:(NSWindow *)sender {
582
- // todo: Implement a way to prevent a window closing from bun
583
-
584
- return YES;
585
- }
586
- - (void)windowWillClose:(NSNotification *)notification {
587
- // todo: Perform any cleanup needed
588
- NSWindow *window = [notification object];
589
- // [window setContentView:nil]; // Release content view if needed
590
-
591
- if (self.closeHandler) {
592
- self.closeHandler(self.windowId);
593
- }
594
- }
595
- - (void)windowDidResize:(NSNotification *)notification {
596
- if (self.resizeHandler) {
597
- NSWindow *window = [notification object];
598
- NSRect windowFrame = [window frame];
599
-
600
- NSScreen *primaryScreen = getPrimaryScreen();
601
- NSRect screenFrame = [primaryScreen frame];
602
- windowFrame.origin.y = screenFrame.size.height - windowFrame.origin.y - windowFrame.size.height;
603
-
604
- // Note: send x and y when resizing in case window is resized from the top left corner
605
- self.resizeHandler(self.windowId, windowFrame.origin.x, windowFrame.origin.y, windowFrame.size.width, windowFrame.size.height);
606
- }
607
- }
608
-
609
- - (void)windowDidMove:(NSNotification *)notification {
610
- if (self.moveHandler) {
611
- NSWindow *window = [notification object];
612
- // Note: windowFrame will be the bottom-left corner of the window's position relative to the bottom-left corner of the screen
613
- // so we need to adjust it
614
- NSRect windowFrame = [window frame];
615
- NSScreen *primaryScreen = getPrimaryScreen();
616
- NSRect screenFrame = [primaryScreen frame];
617
- windowFrame.origin.y = screenFrame.size.height - windowFrame.origin.y - windowFrame.size.height;
618
-
619
- // todo: double check later about how we position windows (contentRect) vs move and resize handlers that use the frame
620
- // may cause offset differences between frame and frameless windows
621
- self.moveHandler(self.windowId, windowFrame.origin.x, windowFrame.origin.y);
622
- }
623
- }
624
- @end
625
-
626
-
627
- typedef struct {
628
- NSRect frame;
629
- WindowStyleMaskOptions styleMask;
630
- const char *titleBarStyle;
631
- } createNSWindowWithFrameAndStyleParams;
632
-
633
- NSWindow *createNSWindowWithFrameAndStyle(uint32_t windowId, createNSWindowWithFrameAndStyleParams config, WindowCloseHandler zigCloseHandler, WindowMoveHandler zigMoveHandler, WindowResizeHandler zigResizeHandler) {
634
-
635
- // frame is top-left window corner relative to screen's top-left corner
636
- // but NSWindow wants bottom-left window corner relative to screen's bottom-left corner
637
- // so we need to adjust the y position
638
- NSScreen *primaryScreen = getPrimaryScreen();
639
- NSRect screenFrame = [primaryScreen frame];
640
-
641
- config.frame.origin.y = screenFrame.size.height - config.frame.origin.y;
642
-
643
- NSWindow *window = [[NSWindow alloc] initWithContentRect:config.frame
644
- styleMask:getNSWindowStyleMask(config.styleMask)
645
- backing:NSBackingStoreBuffered
646
- defer:YES
647
- screen:primaryScreen];
648
-
649
- // Note: there's something funky about initWithContentRect, no matter what screen it's positioned on the active
650
- // screen will somehow make a difference when subtracting the config.frame.size.height (to switch from bottom-left
651
- // of window to top-left of window positioning) so we need to use setFrameTopLeftPoint to get consistent
652
- // behaviour
653
- [window setFrameTopLeftPoint:config.frame.origin];
654
-
655
-
656
- if (strcmp(config.titleBarStyle, "hiddenInset") == 0) {
657
- window.titlebarAppearsTransparent = YES;
658
- window.titleVisibility = NSWindowTitleHidden;
659
- }
660
-
661
- WindowDelegate *delegate = [[WindowDelegate alloc] init];
662
- delegate.closeHandler = zigCloseHandler;
663
- delegate.resizeHandler = zigResizeHandler;
664
- delegate.moveHandler = zigMoveHandler;
665
- delegate.windowId = windowId;
666
- [window setDelegate:delegate];
667
- objc_setAssociatedObject(window, "WindowDelegate", delegate, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
668
- // ARC will try to release the window or something which will be one too many
669
- // or something leading to a panic crash.. or something. Anyway after
670
- // losing my mind over this behaviour all day setting this to NO fixes it.
671
- window.releasedWhenClosed = NO;
672
-
673
- // Give it a default content view that can accept subviews later on
674
- NSView *contentView = [[NSView alloc] initWithFrame:[window frame]];
675
- [window setContentView:contentView];
676
-
677
- return window;
678
- }
679
-
680
- void makeNSWindowKeyAndOrderFront(NSWindow *window) {
681
- [window makeKeyAndOrderFront:nil];
682
- }
683
-
684
- void setNSWindowTitle(NSWindow *window, const char *title) {
685
- NSString *titleString = [NSString stringWithUTF8String:title];
686
- [window setTitle:titleString];
687
- }
688
-
689
- void closeNSWindow(NSWindow *window) {
690
- // todo: close all the webviews
691
- [window close];
692
- }
693
-
694
- void addWebviewToWindow(NSWindow *window, NSView *view) {
695
-
696
- [window.contentView addSubview:view positioned:NSWindowAbove relativeTo:nil];
697
-
698
- CGFloat adjustedY = view.superview.bounds.size.height - view.frame.origin.y - view.frame.size.height;
699
- view.frame = NSMakeRect(view.frame.origin.x, adjustedY, view.frame.size.width, view.frame.size.height);
700
-
701
- }
702
-
703
- void resizeWebview(NSView *view, NSRect frame) {
704
- CGFloat adjustedY = view.superview.bounds.size.height - frame.origin.y - frame.size.height;
705
- view.frame = NSMakeRect(frame.origin.x, adjustedY, frame.size.width, frame.size.height);
706
- }
707
-
708
- typedef void (*zigSnapshotCallback)(uint32_t hostId, uint32_t webviewId, const char * dataUrl);
709
-
710
- void getWebviewSnapshot(uint32_t hostId, uint32_t webviewId, WKWebView *webView, zigSnapshotCallback callback){
711
- // Create a snapshot configuration
712
- WKSnapshotConfiguration *snapshotConfig = [[WKSnapshotConfiguration alloc] init];
713
-
714
- // Capture the snapshot
715
- [webView takeSnapshotWithConfiguration:snapshotConfig completionHandler:^(NSImage *snapshotImage, NSError *error) {
716
- if (error) {
717
- NSLog(@"Error capturing snapshot: %@", error);
718
- return;
719
- }
720
-
721
- // Convert the image to PNG data
722
- NSBitmapImageRep *imgRep = [[NSBitmapImageRep alloc] initWithData:[snapshotImage TIFFRepresentation]];
723
- NSData *pngData = [imgRep representationUsingType:NSBitmapImageFileTypePNG properties:@{}];
724
-
725
- // Convert PNG data to Base64 string
726
- NSString *base64String = [pngData base64EncodedStringWithOptions:0];
727
-
728
- // Create Data URL
729
- NSString *dataUrl = [NSString stringWithFormat:@"data:image/png;base64,%@", base64String];
730
-
731
- // Return the Data URL
732
- if (callback) {
733
- callback(hostId, webviewId, [dataUrl UTF8String]);
734
- }
735
- }];
736
- }
737
-
738
- // todo: rename these from webviewTagX to webviewX
739
- // This makes the webview invisible.
740
- void webviewTagSetTransparent(WKWebView *webview, BOOL transparent) {
741
- if (transparent) {
742
- webview.layer.opacity = 0;
743
- } else {
744
- webview.layer.opacity = 1;
745
- }
746
- }
747
-
748
- void webviewTagSetPassthrough(TransparentWKWebView *webview, BOOL enablePassthrough) {
749
- if (enablePassthrough) {
750
- webview.isMousePassthroughEnabled = YES;
751
- } else {
752
- webview.isMousePassthroughEnabled = NO;
753
- }
754
- }
755
-
756
- void webviewSetHidden(WKWebView *webview, BOOL hidden) {
757
- if (hidden) {
758
- [webview setHidden:YES];
759
- } else {
760
- [webview setHidden:NO];
761
- }
762
- }
763
-
764
- NSRect createNSRectWrapper(double x, double y, double width, double height) {
765
- return NSMakeRect(x, y, width, height);
766
- }
767
-
768
-
769
-
770
- // navigation delegate that
771
- typedef BOOL (*DecideNavigationCallback)(uint32_t webviewId, const char* url);
772
- typedef void (*WebviewEventHandler)(uint32_t webviewId, const char* type, const char* url);
773
-
774
- @interface MyNavigationDelegate : NSObject <WKNavigationDelegate>
775
- @property (nonatomic, assign) DecideNavigationCallback zigCallback;
776
- @property (nonatomic, assign) WebviewEventHandler zigEventHandler;
777
- @property (nonatomic, assign) uint32_t webviewId;
778
- @end
779
-
780
- @implementation MyNavigationDelegate
781
-
782
- - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
783
- NSURL *newURL = navigationAction.request.URL;
784
-
785
- BOOL shouldAllow = self.zigCallback(self.webviewId, newURL.absoluteString.UTF8String);
786
- decisionHandler(shouldAllow ? WKNavigationActionPolicyAllow : WKNavigationActionPolicyCancel);
787
- }
788
-
789
- - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
790
- self.zigEventHandler(self.webviewId, "did-navigate", webView.URL.absoluteString.UTF8String);
791
- }
792
-
793
- - (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation {
794
- self.zigEventHandler(self.webviewId, "did-commit-navigation", webView.URL.absoluteString.UTF8String);
795
- }
796
-
797
- @end
798
-
799
- // UIDelegate, handle opening new windows
800
- @interface MyWebViewUIDelegate : NSObject <WKUIDelegate>
801
- @property (nonatomic, assign) WebviewEventHandler zigEventHandler;
802
- @property (nonatomic, assign) uint32_t webviewId;
803
- @end
804
-
805
- @implementation MyWebViewUIDelegate
806
-
807
- // Handle new window requests by emitting an event
808
- // user can handle the new-window-open event and choose to create a new webview, new window, new tab, or whatever
809
- // fits their app. They can also inject js into the browser context to capture cmd + t and open a new window or tab or
810
- // whatever
811
- - (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {
812
- if (!navigationAction.targetFrame.isMainFrame) {
813
- self.zigEventHandler(self.webviewId, "new-window-open", navigationAction.request.URL.absoluteString.UTF8String);
814
- }
815
- return nil;
816
- }
817
-
818
- @end
819
-
820
-
821
-
822
- MyNavigationDelegate* setNavigationDelegateWithCallback(WKWebView *webView, uint32_t webviewId, DecideNavigationCallback callback, WebviewEventHandler eventHandler) {
823
- MyNavigationDelegate *navigationDelegate = [[MyNavigationDelegate alloc] init];
824
- navigationDelegate.zigCallback = callback;
825
- navigationDelegate.zigEventHandler = eventHandler;
826
- navigationDelegate.webviewId = webviewId;
827
- webView.navigationDelegate = navigationDelegate;
828
-
829
- objc_setAssociatedObject(webView, "NavigationDelegate", navigationDelegate, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
830
-
831
-
832
- MyWebViewUIDelegate *uiDelegate = [[MyWebViewUIDelegate alloc] init];
833
- uiDelegate.zigEventHandler = eventHandler;
834
- uiDelegate.webviewId = webviewId;
835
- webView.UIDelegate = uiDelegate;
836
-
837
- objc_setAssociatedObject(webView, "UIDelegate", uiDelegate, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
838
-
839
- // todo: we don't have to return this to free from zig since we're using objc_setAssociatedObject now
840
- return navigationDelegate;
841
- }
842
-
843
-
844
- // add postMessage handler
845
- typedef BOOL (*HandlePostMessage)(uint32_t webviewId, const char* message);
846
-
847
- // todo: add webviewId as a property here
848
- @interface MyScriptMessageHandler : NSObject <WKScriptMessageHandler>
849
- @property (nonatomic, assign) HandlePostMessage zigCallback;
850
- @property (nonatomic, assign) uint32_t webviewId;
851
- @end
852
-
853
- @implementation MyScriptMessageHandler
854
-
855
- - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
856
- NSString *body = message.body;
857
-
858
- self.zigCallback(self.webviewId, body.UTF8String);
859
- }
860
-
861
- @end
862
-
863
- MyScriptMessageHandler* addScriptMessageHandler(WKWebView *webView, uint32_t webviewId, const char *name, HandlePostMessage callback) {
864
- MyScriptMessageHandler *handler = [[MyScriptMessageHandler alloc] init];
865
- handler.zigCallback = callback;
866
- handler.webviewId = webviewId;
867
- [webView.configuration.userContentController addScriptMessageHandler:handler name:[NSString stringWithUTF8String:name]];
868
-
869
- NSString *key = [NSString stringWithFormat:@"PostMessageHandler{%s}", name];
870
- objc_setAssociatedObject(webView, key.UTF8String, handler, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
871
-
872
- return handler;
873
- }
874
-
875
-
876
- // add postMessage handler with reply
877
- typedef const char* (*HandlePostMessageWithReply)(uint32_t webviewId, const char* message);
878
-
879
- @interface MyScriptMessageHandlerWithReply : NSObject <WKScriptMessageHandlerWithReply>
880
-
881
- @property (nonatomic, assign) HandlePostMessageWithReply zigCallback;
882
- @property (nonatomic, assign) uint32_t webviewId;
883
-
884
- @end
885
-
886
- @implementation MyScriptMessageHandlerWithReply
887
-
888
- - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message replyHandler:(void (^)(id _Nullable, NSString * _Nullable))replyHandler {
889
- NSString *body = message.body;
890
-
891
- // Call the zig callback and pass the completion handler to send replies
892
- const char *response = self.zigCallback(self.webviewId, body.UTF8String);
893
-
894
- NSString *responseNSString = [NSString stringWithUTF8String:response];
895
-
896
- replyHandler(responseNSString, nil);
897
- }
898
-
899
- @end
900
-
901
- MyScriptMessageHandlerWithReply* addScriptMessageHandlerWithReply(WKWebView *webView, uint32_t webviewId, const char *name, HandlePostMessageWithReply callback) {
902
- MyScriptMessageHandlerWithReply *handler = [[MyScriptMessageHandlerWithReply alloc] init];
903
- handler.zigCallback = callback;
904
- handler.webviewId = webviewId;
905
-
906
- // Use the new API to add the script message handler
907
- [webView.configuration.userContentController addScriptMessageHandlerWithReply:handler contentWorld:WKContentWorld.pageWorld name:[NSString stringWithUTF8String:name]];
908
-
909
- NSString *key = [NSString stringWithFormat:@"PostMessageHandlerWithReply{%s}", name];
910
- objc_setAssociatedObject(webView, key.UTF8String, handler, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
911
-
912
-
913
- return handler;
914
- }
915
-
916
-
917
-
918
- // example calling function after a delay for debugging
919
- // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
920
- // // Remove the WebView after 10 seconds
921
- // [view removeFromSuperview];
922
- // NSLog(@"WebView removed after 10 seconds");
923
- // });
924
-
925
-
926
- // FS
927
-
928
-
929
-
930
- BOOL moveToTrash(char *pathString) {
931
- NSString *path = [NSString stringWithUTF8String:pathString];
932
- NSURL *fileURL = [NSURL fileURLWithPath:path];
933
- NSError *error = nil;
934
- NSURL *resultingURL = nil;
935
-
936
- NSFileManager *fileManager = [NSFileManager defaultManager];
937
- BOOL success = [fileManager trashItemAtURL:fileURL resultingItemURL:&resultingURL error:&error];
938
-
939
- if (success) {
940
- NSLog(@"Moved to Trash: %@", resultingURL);
941
- } else {
942
- NSLog(@"Error: %@", error);
943
- }
944
-
945
- return success;
946
- }
947
-
948
- void showItemInFolder(char *path) {
949
- NSString *pathString = [NSString stringWithUTF8String:path];
950
- NSURL *fileURL = [NSURL fileURLWithPath:pathString];
951
- [[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:@[fileURL]];
952
- }
953
-
954
- const char *openFileDialog(const char *startingFolder, const char *allowedFileTypes, BOOL canChooseFiles, BOOL canChooseDirectories, BOOL allowsMultipleSelection) {
955
- NSOpenPanel *panel = [NSOpenPanel openPanel];
956
- [panel setCanChooseFiles:canChooseFiles];
957
- [panel setCanChooseDirectories:canChooseDirectories];
958
- [panel setAllowsMultipleSelection:allowsMultipleSelection];
959
-
960
- // Set the starting directory
961
- NSString *startingFolderString = [NSString stringWithUTF8String:startingFolder];
962
- [panel setDirectoryURL:[NSURL fileURLWithPath:startingFolderString]];
963
-
964
- // Set allowed file types
965
- if (allowedFileTypes != NULL && strcmp(allowedFileTypes, "*") != 0 && strcmp(allowedFileTypes, "") != 0) {
966
- NSString *allowedFileTypesString = [NSString stringWithUTF8String:allowedFileTypes];
967
- NSArray *fileTypesArray = [allowedFileTypesString componentsSeparatedByString:@","];
968
- // Note: this is deprecated but it still works for now and is simpler than the current solution
969
- #pragma clang diagnostic push
970
- #pragma clang diagnostic ignored "-Wdeprecated-declarations"
971
- [panel setAllowedFileTypes:fileTypesArray];
972
- #pragma clang diagnostic pop
973
- }
974
-
975
- NSInteger result = [panel runModal];
976
- // return a comma separated list of file paths
977
- if (result == NSModalResponseOK) {
978
- NSArray<NSURL *> *selectedFileURLs = [panel URLs];
979
- NSMutableArray<NSString *> *pathStrings = [NSMutableArray array];
980
- for (NSURL *url in selectedFileURLs) {
981
- [pathStrings addObject:[url path]];
982
- }
983
- NSString *concatenatedPaths = [pathStrings componentsJoinedByString:@","];
984
- return strdup([concatenatedPaths UTF8String]);
985
- }
986
-
987
- return NULL;
988
- }
989
-
990
-
991
- // window move
992
-
993
-
994
- static BOOL isMovingWindow = NO;
995
- static NSWindow *targetWindow = nil;
996
- static CGFloat offsetX = 0.0;
997
- static CGFloat offsetY = 0.0;
998
- static id mouseDraggedMonitor = nil;
999
- static id mouseUpMonitor = nil;
1000
-
1001
- void stopWindowMove() {
1002
- isMovingWindow = NO;
1003
- targetWindow = nil;
1004
- offsetX = 0.0;
1005
- offsetY = 0.0;
1006
-
1007
- if (mouseDraggedMonitor) {
1008
- [NSEvent removeMonitor:mouseDraggedMonitor];
1009
- mouseDraggedMonitor = nil;
1010
- }
1011
-
1012
- if (mouseUpMonitor) {
1013
- [NSEvent removeMonitor:mouseUpMonitor];
1014
- mouseUpMonitor = nil;
1015
- }
1016
- }
1017
-
1018
- void startWindowMove(WKWebView *webView) {
1019
- targetWindow = webView.window;
1020
- if (!targetWindow) {
1021
- NSLog(@"No window found for the given WebView.");
1022
- return;
1023
- }
1024
-
1025
- isMovingWindow = YES;
1026
-
1027
- NSPoint initialLocation = [NSEvent mouseLocation];
1028
-
1029
- mouseDraggedMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:(NSEventMaskLeftMouseDragged | NSEventMaskMouseMoved) handler:^NSEvent *(NSEvent *event) {
1030
- if (isMovingWindow) {
1031
- NSPoint currentLocation = [NSEvent mouseLocation];
1032
-
1033
- if (offsetX == 0.0 && offsetY == 0.0) {
1034
- NSPoint windowOrigin = targetWindow.frame.origin;
1035
- offsetX = initialLocation.x - windowOrigin.x;
1036
- offsetY = initialLocation.y - windowOrigin.y;
1037
- }
1038
-
1039
- CGFloat newX = currentLocation.x - offsetX;
1040
- CGFloat newY = currentLocation.y - offsetY;
1041
-
1042
- [targetWindow setFrameOrigin:NSMakePoint(newX, newY)];
1043
- }
1044
- return event;
1045
- }];
1046
-
1047
- mouseUpMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskLeftMouseUp handler:^NSEvent *(NSEvent *event) {
1048
- if (isMovingWindow) {
1049
- stopWindowMove();
1050
- }
1051
- return event;
1052
- }];
1053
- }
1054
-
1055
-
1056
- // system tray and menues
1057
- typedef void (*MenuHandler)(const char *menuItemId);
1058
- typedef void (*ZigStatusItemHandler)(uint32_t trayId, const char *action);
1059
-
1060
- @interface StatusItemTarget : NSObject
1061
- @property (nonatomic, assign) NSStatusItem *statusItem;
1062
- @property (nonatomic, assign) ZigStatusItemHandler zigHandler;
1063
- @property (nonatomic, assign) uint32_t trayId;
1064
-
1065
- - (void)statusItemClicked:(id)sender;
1066
- - (void)menuItemClicked:(id)sender;
1067
-
1068
- @end
1069
-
1070
- @implementation StatusItemTarget
1071
- - (void)statusItemClicked:(id)sender {
1072
- // If there's not menu associated with this status item, then clicking and right clicking on it will
1073
- // trigger this. If there's a menu, then this click is ignored and menu clicks call menuItemClicked instead.
1074
- if (self.zigHandler) {
1075
- self.zigHandler(self.trayId, "");
1076
- }
1077
- }
1078
- - (void)menuItemClicked:(id)sender {
1079
- // If there's a menu then only menu
1080
- NSMenuItem *menuItem = (NSMenuItem *)sender;
1081
- NSString *action = menuItem.representedObject;
1082
-
1083
- if (!action) {
1084
- NSLog(@"No action found for menu item");
1085
- return;
1086
- }
1087
-
1088
- if (!self.zigHandler) {
1089
- NSLog(@"No zig handler found for menu item");
1090
- return;
1091
- }
1092
-
1093
- self.zigHandler(self.trayId, [action UTF8String]);
1094
-
1095
- }
1096
- @end
1097
-
1098
- NSStatusItem* createTray(uint32_t trayId, const char *title, const char *pathToImage, bool template, uint32_t width, uint32_t height, ZigStatusItemHandler zigTrayItemHandler) {
1099
- NSString *pathToImageString = [NSString stringWithUTF8String:pathToImage];
1100
- NSString *titleString = [NSString stringWithUTF8String:title];
1101
- NSStatusItem *statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
1102
-
1103
- if (pathToImageString.length > 0) {
1104
- statusItem.button.image = [[NSImage alloc] initWithContentsOfFile:pathToImageString];
1105
- statusItem.button.image.template = template;
1106
- statusItem.button.image.size = NSMakeSize(width, height);
1107
- }
1108
- if (titleString.length > 0) {
1109
- statusItem.button.title = titleString;
1110
- }
1111
-
1112
- if (zigTrayItemHandler) {
1113
- StatusItemTarget *target = [[StatusItemTarget alloc] init];
1114
- target.statusItem = statusItem;
1115
- target.zigHandler = zigTrayItemHandler;
1116
- target.trayId = trayId;
1117
-
1118
- objc_setAssociatedObject(statusItem.button, "statusItemTarget", target, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
1119
- [statusItem.button setTarget:target];
1120
- [statusItem.button setAction:@selector(statusItemClicked:)];
1121
-
1122
- // Ensure the button listens for both left and right mouse up events
1123
- [statusItem.button sendActionOn:NSEventMaskLeftMouseUp | NSEventMaskRightMouseUp];
1124
- }
1125
-
1126
- retainObjCObject(statusItem);
1127
-
1128
- return statusItem;
1129
- }
1130
-
1131
- void setTrayTitle(NSStatusItem *statusItem, const char *title) {
1132
- if (statusItem) {
1133
- statusItem.button.title = [NSString stringWithUTF8String:title];
1134
- }
1135
- }
1136
-
1137
- void setTrayImage(NSStatusItem *statusItem, const char *image) {
1138
- if (statusItem) {
1139
- statusItem.button.image = [[NSImage alloc] initWithContentsOfFile:[NSString stringWithUTF8String:image]];
1140
- }
1141
- }
1142
-
1143
- // application menus
1144
- // todo: consider consolidating with tray menus
1145
- NSMenu *createMenuFromConfig(NSArray *menuConfig, StatusItemTarget *target) {
1146
- NSMenu *menu = [[NSMenu alloc] init];
1147
- [menu setAutoenablesItems:NO]; // Disable auto-enabling of menu items
1148
-
1149
- for (NSDictionary *itemData in menuConfig) {
1150
- NSString *type = itemData[@"type"];
1151
- NSString *label = itemData[@"label"];
1152
- NSString *action = itemData[@"action"];
1153
- NSArray *submenuConfig = itemData[@"submenu"];
1154
- NSString *role = itemData[@"role"];
1155
- NSString *accelerator = itemData[@"accelerator"];
1156
- NSNumber *modifierMask = itemData[@"modifierMask"];
1157
-
1158
- BOOL enabled = [itemData[@"enabled"] boolValue];
1159
- BOOL checked = [itemData[@"checked"] boolValue];
1160
- BOOL hidden = [itemData[@"hidden"] boolValue];
1161
- NSString *tooltip = itemData[@"tooltip"];
1162
-
1163
- NSMenuItem *menuItem;
1164
-
1165
- if ([type isEqualToString:@"divider"]) {
1166
- menuItem = [NSMenuItem separatorItem];
1167
- } else {
1168
- menuItem = [[NSMenuItem alloc] initWithTitle:label action:@selector(menuItemClicked:) keyEquivalent:@""];
1169
- menuItem.representedObject = action;
1170
-
1171
-
1172
- if (role) {
1173
- if ([role isEqualToString:@"quit"]) {
1174
- menuItem.action = @selector(terminate:);
1175
- } else if ([role isEqualToString:@"hide"]) {
1176
- menuItem.action = @selector(hide:);
1177
- } else if ([role isEqualToString:@"hideOthers"]) {
1178
- menuItem.action = @selector(hideOtherApplications:);
1179
- } else if ([role isEqualToString:@"showAll"]) {
1180
- menuItem.action = @selector(unhideAllApplications:);
1181
- } else if ([role isEqualToString:@"undo"]) {
1182
- menuItem.action = @selector(undo:);
1183
- } else if ([role isEqualToString:@"redo"]) {
1184
- menuItem.action = @selector(redo:);
1185
- } else if ([role isEqualToString:@"cut"]) {
1186
- menuItem.action = @selector(cut:);
1187
- } else if ([role isEqualToString:@"copy"]) {
1188
- menuItem.action = @selector(copy:);
1189
- } else if ([role isEqualToString:@"paste"]) {
1190
- menuItem.action = @selector(paste:);
1191
- } else if ([role isEqualToString:@"pasteAndMatchStyle"]) {
1192
- menuItem.action = @selector(pasteAsPlainText:);
1193
- } else if ([role isEqualToString:@"delete"]) {
1194
- menuItem.action = @selector(delete:);
1195
- } else if ([role isEqualToString:@"selectAll"]) {
1196
- menuItem.action = @selector(selectAll:);
1197
- } else if ([role isEqualToString:@"startSpeaking"]) {
1198
- menuItem.action = @selector(startSpeaking:);
1199
- } else if ([role isEqualToString:@"stopSpeaking"]) {
1200
- menuItem.action = @selector(stopSpeaking:);
1201
- } else if ([role isEqualToString:@"enterFullScreen"]) {
1202
- menuItem.action = @selector(enterFullScreen:);
1203
- } else if ([role isEqualToString:@"exitFullScreen"]) {
1204
- menuItem.action = @selector(exitFullScreen:);
1205
- } else if ([role isEqualToString:@"toggleFullScreen"]) {
1206
- menuItem.action = @selector(toggleFullScreen:);
1207
- } else if ([role isEqualToString:@"minimize"]) {
1208
- menuItem.action = @selector(performMiniaturize:);
1209
- } else if ([role isEqualToString:@"zoom"]) {
1210
- menuItem.action = @selector(performZoom:);
1211
- } else if ([role isEqualToString:@"bringAllToFront"]) {
1212
- menuItem.action = @selector(arrangeInFront:);
1213
- } else if ([role isEqualToString:@"close"]) {
1214
- menuItem.action = @selector(performClose:);
1215
- } else if ([role isEqualToString:@"cycleThroughWindows"]) {
1216
- menuItem.action = @selector(selectNextKeyView:);
1217
- } else if ([role isEqualToString:@"showHelp"]) {
1218
- menuItem.action = @selector(showHelp:);
1219
- }
1220
-
1221
- if (!accelerator) {
1222
- // set 'default' keyboard shortcuts for given roles
1223
- if ([role isEqualToString:@"undo"]) {
1224
- menuItem.keyEquivalent = @"z";
1225
- menuItem.keyEquivalentModifierMask = NSEventModifierFlagCommand;
1226
- } else if ([role isEqualToString:@"redo"]) {
1227
- menuItem.keyEquivalent = @"Z";
1228
- menuItem.keyEquivalentModifierMask = NSEventModifierFlagCommand | NSEventModifierFlagShift;
1229
- } else if ([role isEqualToString:@"cut"]) {
1230
- menuItem.keyEquivalent = @"x";
1231
- menuItem.keyEquivalentModifierMask = NSEventModifierFlagCommand;
1232
- } else if ([role isEqualToString:@"copy"]) {
1233
- menuItem.keyEquivalent = @"c";
1234
- menuItem.keyEquivalentModifierMask = NSEventModifierFlagCommand;
1235
- } else if ([role isEqualToString:@"paste"]) {
1236
- menuItem.keyEquivalent = @"v";
1237
- menuItem.keyEquivalentModifierMask = NSEventModifierFlagCommand;
1238
- } else if ([role isEqualToString:@"pasteAndMatchStyle"]) {
1239
- menuItem.keyEquivalent = @"V";
1240
- menuItem.keyEquivalentModifierMask = NSEventModifierFlagCommand | NSEventModifierFlagOption;
1241
- } else if ([role isEqualToString:@"delete"]) {
1242
- menuItem.keyEquivalent = [NSString stringWithFormat:@"%c", (char)NSDeleteCharacter]; // Delete key
1243
- menuItem.keyEquivalentModifierMask = 0;
1244
- } else if ([role isEqualToString:@"selectAll"]) {
1245
- menuItem.keyEquivalent = @"a";
1246
- menuItem.keyEquivalentModifierMask = NSEventModifierFlagCommand;
1247
- }
1248
- }
1249
- } else {
1250
- // Note: if we set the target it will look for the method on the target. eg: copy instead
1251
- // of letting the os handle it
1252
- menuItem.target = target;
1253
- }
1254
-
1255
- if (accelerator) {
1256
- menuItem.keyEquivalent = accelerator;
1257
- if (modifierMask) {
1258
- menuItem.keyEquivalentModifierMask = [modifierMask unsignedIntegerValue];
1259
- } else {
1260
- menuItem.keyEquivalentModifierMask = NSEventModifierFlagCommand; // Default to Command key if no modifier specified
1261
- }
1262
- }
1263
-
1264
- menuItem.enabled = enabled;
1265
- menuItem.state = checked ? NSControlStateValueOn : NSControlStateValueOff;
1266
- menuItem.hidden = hidden;
1267
- menuItem.toolTip = tooltip;
1268
-
1269
- if (submenuConfig) {
1270
- NSMenu *submenu = createMenuFromConfig(submenuConfig, target);
1271
- [menu setSubmenu:submenu forItem:menuItem];
1272
- }
1273
- }
1274
- [menu addItem:menuItem];
1275
- }
1276
-
1277
- return menu;
1278
- }
1279
-
1280
- void setTrayMenuFromJSON(NSStatusItem *statusItem, const char *jsonString) {
1281
- if (statusItem) {
1282
- StatusItemTarget *target = objc_getAssociatedObject(statusItem.button, "statusItemTarget");
1283
-
1284
- NSData *jsonData = [NSData dataWithBytes:jsonString length:strlen(jsonString)];
1285
- NSError *error;
1286
- NSArray *menuArray = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
1287
-
1288
- if (error) {
1289
- NSLog(@"Failed to parse JSON: %@", error);
1290
- return;
1291
- }
1292
-
1293
- NSMenu *menu = createMenuFromConfig(menuArray, target);
1294
- [statusItem setMenu:menu];
1295
- }
1296
- }
1297
-
1298
- void setTrayMenu(NSStatusItem *statusItem, const char *menuConfig) {
1299
- if (statusItem) {
1300
- setTrayMenuFromJSON(statusItem, menuConfig);
1301
- }
1302
- }
1303
-
1304
-
1305
-
1306
-
1307
- void setApplicationMenu(const char *jsonString, ZigStatusItemHandler zigTrayItemHandler) {
1308
- NSLog(@"Setting application menu from JSON in objc");
1309
-
1310
- NSData *jsonData = [NSData dataWithBytes:jsonString length:strlen(jsonString)];
1311
- NSError *error;
1312
- NSArray *menuArray = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
1313
-
1314
- if (error) {
1315
- NSLog(@"Failed to parse JSON: %@", error);
1316
- return;
1317
- }
1318
-
1319
- // Note: consider using a generic target for both system tray and application menu
1320
- // for now we just create a status item that just serves as a way to reference the zig menu click handler
1321
- StatusItemTarget *target = [[StatusItemTarget alloc] init];
1322
- target.zigHandler = zigTrayItemHandler;
1323
- target.trayId = 0;
1324
- NSMenu *menu = createMenuFromConfig(menuArray, target);
1325
-
1326
- objc_setAssociatedObject(NSApp, "AppMenuTarget", target, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
1327
-
1328
-
1329
- [NSApp setMainMenu:menu];
1330
- }
1331
-
1332
- void showContextMenu(const char *jsonString, ZigStatusItemHandler contextMenuHandler) {
1333
- NSData *jsonData = [NSData dataWithBytes:jsonString length:strlen(jsonString)];
1334
- NSError *error;
1335
- NSArray *menuArray = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
1336
-
1337
- if (error) {
1338
- NSLog(@"Failed to parse JSON: %@", error);
1339
- return;
1340
- }
1341
-
1342
- // Note: consider using a generic target for both system tray and application menu
1343
- // for now we just create a status item that just serves as a way to reference the zig menu click handler
1344
- StatusItemTarget *target = [[StatusItemTarget alloc] init];
1345
- target.zigHandler = contextMenuHandler;
1346
- target.trayId = 0;
1347
- NSMenu *menu = createMenuFromConfig(menuArray, target);
1348
-
1349
- objc_setAssociatedObject(menu, "ContextMenuTarget", target, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
1350
-
1351
- NSPoint mouseLocation = [NSEvent mouseLocation];
1352
-
1353
- NSEvent *event = [NSEvent mouseEventWithType:NSEventTypeRightMouseUp
1354
- location:mouseLocation
1355
- modifierFlags:0
1356
- timestamp:0
1357
- windowNumber:0
1358
- context:nil
1359
- eventNumber:0
1360
- clickCount:1
1361
- pressure:1];
1362
-
1363
-
1364
- // Note: can associate it with a view if needed, but I like the idea of being able to programmatically opening a context
1365
- // menu where the mouse is even if there are no windows open. There's a class of desktop apps like clipboard managers
1366
- // or screen capture tools that maybe have a system tray icon but no windows open when you want a global context menu.
1367
-
1368
- // NSWindow *activeWindow = [NSApp keyWindow];
1369
- // [NSMenu popUpContextMenu:menu withEvent:event forView:contentView];
1370
- // NSView *contentView = activeWindow.contentView;
1371
- // NSPoint windowMouseLocation = [activeWindow convertRectFromScreen:NSMakeRect(mouseLocation.x, mouseLocation.y, 0, 0)].origin;
1372
- // [menu popUpMenuPositioningItem:nil atLocation:windowMouseLocation inView:contentView];
1373
-
1374
- [menu popUpMenuPositioningItem:nil atLocation:mouseLocation inView:nil];
1375
-
1376
-
1377
- objc_setAssociatedObject(NSApp, "ContextMenu", target, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
1378
- }
1379
-
1380
-