akanjs 3.0.0-beta.20 → 3.0.0-beta.21

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 (731) hide show
  1. package/README.ko.md +0 -1
  2. package/README.md +0 -1
  3. package/base/baseEnv.ts +40 -3
  4. package/client/cookie.ts +56 -20
  5. package/client/device.ts +47 -95
  6. package/client/frameConfig.ts +2 -2
  7. package/client/native.ts +44 -0
  8. package/client/router.ts +11 -1
  9. package/client/rscNavigation.ts +5 -0
  10. package/client/storage.ts +68 -39
  11. package/fetch/client/fetchClient.ts +13 -4
  12. package/index.ts +47 -46
  13. package/package.json +6 -87
  14. package/server/devtools/signalSerializer.ts +1 -2
  15. package/server/hmr/devHmrController.ts +29 -11
  16. package/server/resolver/signal.resolver.ts +1 -10
  17. package/server/routeTreeBuilder.ts +8 -11
  18. package/server/routing/apiRouter.ts +15 -2
  19. package/server/rscClient.tsx +1 -2
  20. package/server/ssrFromRscRenderer.tsx +2 -0
  21. package/server/webRouter.ts +1 -0
  22. package/signal/CrossSiteGuard.ts +34 -2
  23. package/signal/endpoint.ts +12 -7
  24. package/signal/endpointInfo.ts +13 -0
  25. package/signal/internal.ts +9 -5
  26. package/signal/serializer/fetch.serializer.ts +6 -3
  27. package/signal/slice.ts +34 -24
  28. package/store/baseSt.ts +0 -1
  29. package/store/storeInstance.ts +29 -17
  30. package/types/client/cookie.d.ts +6 -4
  31. package/types/client/device.d.ts +7 -10
  32. package/types/client/native.d.ts +26 -0
  33. package/types/client/rscNavigation.d.ts +4 -0
  34. package/types/client/storage.d.ts +8 -1
  35. package/types/index.d.ts +48 -44
  36. package/types/server/hmr/devHmrController.d.ts +2 -1
  37. package/types/server/resolver/signal.resolver.d.ts +0 -1
  38. package/types/server/rscClient.d.ts +0 -3
  39. package/types/signal/CrossSiteGuard.d.ts +7 -2
  40. package/types/signal/endpoint.d.ts +1 -1
  41. package/types/signal/endpointInfo.d.ts +3 -0
  42. package/types/signal/slice.d.ts +3 -2
  43. package/types/store/baseSt.d.ts +0 -13
  44. package/types/vendor/@akanjs/native/packages/cli/src/api.d.ts +182 -0
  45. package/types/vendor/@akanjs/native/packages/cli/src/commands/build.d.ts +28 -0
  46. package/types/vendor/@akanjs/native/packages/cli/src/commands/compat.d.ts +2 -0
  47. package/types/vendor/@akanjs/native/packages/cli/src/commands/dev.d.ts +2 -0
  48. package/types/vendor/@akanjs/native/packages/cli/src/commands/doctor.d.ts +37 -0
  49. package/types/vendor/@akanjs/native/packages/cli/src/commands/plugin.d.ts +2 -0
  50. package/types/vendor/@akanjs/native/packages/cli/src/commands/signing.d.ts +2 -0
  51. package/types/vendor/@akanjs/native/packages/cli/src/commands/test.d.ts +2 -0
  52. package/types/vendor/@akanjs/native/packages/cli/src/commands/toolchain.d.ts +2 -0
  53. package/types/vendor/@akanjs/native/packages/cli/src/commands/update.d.ts +2 -0
  54. package/types/vendor/@akanjs/native/packages/cli/src/config.d.ts +278 -0
  55. package/types/vendor/@akanjs/native/packages/cli/src/index.d.ts +2 -0
  56. package/types/vendor/@akanjs/native/packages/cli/src/lib/acl.d.ts +21 -0
  57. package/types/vendor/@akanjs/native/packages/cli/src/lib/apilevel.d.ts +40 -0
  58. package/types/vendor/@akanjs/native/packages/cli/src/lib/apk.d.ts +36 -0
  59. package/types/vendor/@akanjs/native/packages/cli/src/lib/args.d.ts +9 -0
  60. package/types/vendor/@akanjs/native/packages/cli/src/lib/boot.d.ts +32 -0
  61. package/types/vendor/@akanjs/native/packages/cli/src/lib/chrome.d.ts +6 -0
  62. package/types/vendor/@akanjs/native/packages/cli/src/lib/codegen.d.ts +94 -0
  63. package/types/vendor/@akanjs/native/packages/cli/src/lib/compat.d.ts +49 -0
  64. package/types/vendor/@akanjs/native/packages/cli/src/lib/configkeys.d.ts +2 -0
  65. package/types/vendor/@akanjs/native/packages/cli/src/lib/csp.d.ts +51 -0
  66. package/types/vendor/@akanjs/native/packages/cli/src/lib/env.d.ts +44 -0
  67. package/types/vendor/@akanjs/native/packages/cli/src/lib/exec.d.ts +31 -0
  68. package/types/vendor/@akanjs/native/packages/cli/src/lib/googleservices.d.ts +2 -0
  69. package/types/vendor/@akanjs/native/packages/cli/src/lib/hmr.d.ts +120 -0
  70. package/types/vendor/@akanjs/native/packages/cli/src/lib/html.d.ts +20 -0
  71. package/types/vendor/@akanjs/native/packages/cli/src/lib/icons.d.ts +44 -0
  72. package/types/vendor/@akanjs/native/packages/cli/src/lib/image.d.ts +21 -0
  73. package/types/vendor/@akanjs/native/packages/cli/src/lib/iossigning.d.ts +81 -0
  74. package/types/vendor/@akanjs/native/packages/cli/src/lib/launch.d.ts +51 -0
  75. package/types/vendor/@akanjs/native/packages/cli/src/lib/log.d.ts +42 -0
  76. package/types/vendor/@akanjs/native/packages/cli/src/lib/manifestmerge.d.ts +18 -0
  77. package/types/vendor/@akanjs/native/packages/cli/src/lib/maven.d.ts +97 -0
  78. package/types/vendor/@akanjs/native/packages/cli/src/lib/names.d.ts +45 -0
  79. package/types/vendor/@akanjs/native/packages/cli/src/lib/native-plugins.d.ts +67 -0
  80. package/types/vendor/@akanjs/native/packages/cli/src/lib/nativeconfig.d.ts +11 -0
  81. package/types/vendor/@akanjs/native/packages/cli/src/lib/permissions.d.ts +10 -0
  82. package/types/vendor/@akanjs/native/packages/cli/src/lib/plist.d.ts +11 -0
  83. package/types/vendor/@akanjs/native/packages/cli/src/lib/png.d.ts +11 -0
  84. package/types/vendor/@akanjs/native/packages/cli/src/lib/prepare.d.ts +138 -0
  85. package/types/vendor/@akanjs/native/packages/cli/src/lib/privacy.d.ts +13 -0
  86. package/types/vendor/@akanjs/native/packages/cli/src/lib/project.d.ts +208 -0
  87. package/types/vendor/@akanjs/native/packages/cli/src/lib/root.d.ts +1 -0
  88. package/types/vendor/@akanjs/native/packages/cli/src/lib/routes.d.ts +1 -0
  89. package/types/vendor/@akanjs/native/packages/cli/src/lib/serve.d.ts +17 -0
  90. package/types/vendor/@akanjs/native/packages/cli/src/lib/signing.d.ts +14 -0
  91. package/types/vendor/@akanjs/native/packages/cli/src/lib/spec.d.ts +96 -0
  92. package/types/vendor/@akanjs/native/packages/cli/src/lib/toolchains.d.ts +150 -0
  93. package/types/vendor/@akanjs/native/packages/cli/src/lib/updates.d.ts +77 -0
  94. package/types/vendor/@akanjs/native/packages/cli/src/lib/vectors.d.ts +13 -0
  95. package/types/vendor/@akanjs/native/packages/cli/src/lib/xml.d.ts +13 -0
  96. package/types/vendor/@akanjs/native/packages/cli/src/platforms/android.d.ts +57 -0
  97. package/types/vendor/@akanjs/native/packages/cli/src/platforms/desktop-update.d.ts +4 -0
  98. package/types/vendor/@akanjs/native/packages/cli/src/platforms/desktop.d.ts +40 -0
  99. package/types/vendor/@akanjs/native/packages/cli/src/platforms/index.d.ts +14 -0
  100. package/types/vendor/@akanjs/native/packages/cli/src/platforms/ios.d.ts +44 -0
  101. package/types/vendor/@akanjs/native/packages/cli/src/platforms/linux.d.ts +6 -0
  102. package/types/vendor/@akanjs/native/packages/cli/src/platforms/macos.d.ts +7 -0
  103. package/types/vendor/@akanjs/native/packages/cli/src/platforms/targets.d.ts +4 -0
  104. package/types/vendor/@akanjs/native/packages/cli/src/platforms/web-run.d.ts +15 -0
  105. package/types/vendor/@akanjs/native/packages/cli/src/platforms/web.d.ts +2 -0
  106. package/types/vendor/@akanjs/native/packages/cli/src/platforms/windows.d.ts +8 -0
  107. package/types/vendor/@akanjs/native/packages/cli/src/platforms.d.ts +1 -0
  108. package/types/vendor/@akanjs/native/packages/cli/src.d.ts +1 -0
  109. package/types/vendor/@akanjs/native/packages/core/src/acl.d.ts +97 -0
  110. package/types/vendor/@akanjs/native/packages/core/src/boot.d.ts +66 -0
  111. package/types/vendor/@akanjs/native/packages/core/src/contract.d.ts +35 -0
  112. package/types/vendor/@akanjs/native/packages/core/src/errors.d.ts +27 -0
  113. package/types/vendor/@akanjs/native/packages/core/src/files.d.ts +23 -0
  114. package/types/vendor/@akanjs/native/packages/core/src/index.d.ts +14 -0
  115. package/types/vendor/@akanjs/native/packages/core/src/kernel.d.ts +112 -0
  116. package/types/vendor/@akanjs/native/packages/core/src/live.d.ts +12 -0
  117. package/types/vendor/@akanjs/native/packages/core/src/mime.d.ts +2 -0
  118. package/types/vendor/@akanjs/native/packages/core/src/plugin.d.ts +71 -0
  119. package/types/vendor/@akanjs/native/packages/core/src/protocol.d.ts +109 -0
  120. package/types/vendor/@akanjs/native/packages/core/src/runtime.d.ts +66 -0
  121. package/types/vendor/@akanjs/native/packages/core/src/state.d.ts +28 -0
  122. package/types/vendor/@akanjs/native/packages/core/src/testing.d.ts +41 -0
  123. package/types/vendor/@akanjs/native/packages/core/src/version.d.ts +2 -0
  124. package/types/vendor/@akanjs/native/packages/core/src/veto.d.ts +17 -0
  125. package/types/vendor/@akanjs/native/packages/core/src.d.ts +1 -0
  126. package/types/vendor/@akanjs/native/packages/desktop/src/deeplinks.d.ts +24 -0
  127. package/types/vendor/@akanjs/native/packages/desktop/src/delta.d.ts +2 -0
  128. package/types/vendor/@akanjs/native/packages/desktop/src/dispatcher.d.ts +95 -0
  129. package/types/vendor/@akanjs/native/packages/desktop/src/ffi.d.ts +144 -0
  130. package/types/vendor/@akanjs/native/packages/desktop/src/host.d.ts +11 -0
  131. package/types/vendor/@akanjs/native/packages/desktop/src/lifecycle.d.ts +40 -0
  132. package/types/vendor/@akanjs/native/packages/desktop/src/main.d.ts +4 -0
  133. package/types/vendor/@akanjs/native/packages/desktop/src/page-veto.d.ts +17 -0
  134. package/types/vendor/@akanjs/native/packages/desktop/src/paths.d.ts +25 -0
  135. package/types/vendor/@akanjs/native/packages/desktop/src/plugin.d.ts +179 -0
  136. package/types/vendor/@akanjs/native/packages/react/src/index.d.ts +8 -0
  137. package/types/vendor/@akanjs/native/packages/react/src.d.ts +1 -0
  138. package/types/vendor/@akanjs/native/plugins/accessibility/src/announce.d.ts +8 -0
  139. package/types/vendor/@akanjs/native/plugins/accessibility/src/index.d.ts +47 -0
  140. package/types/vendor/@akanjs/native/plugins/accessibility/src/web.d.ts +4 -0
  141. package/types/vendor/@akanjs/native/plugins/accessibility/src.d.ts +1 -0
  142. package/types/vendor/@akanjs/native/plugins/app/src/desktop.d.ts +3 -0
  143. package/types/vendor/@akanjs/native/plugins/app/src/index.d.ts +66 -0
  144. package/types/vendor/@akanjs/native/plugins/app/src/web.d.ts +2 -0
  145. package/types/vendor/@akanjs/native/plugins/app/src.d.ts +1 -0
  146. package/types/vendor/@akanjs/native/plugins/app-state/src/index.d.ts +19 -0
  147. package/types/vendor/@akanjs/native/plugins/app-state/src/web.d.ts +2 -0
  148. package/types/vendor/@akanjs/native/plugins/app-state/src.d.ts +1 -0
  149. package/types/vendor/@akanjs/native/plugins/appearance/src/desktop.d.ts +9 -0
  150. package/types/vendor/@akanjs/native/plugins/appearance/src/index.d.ts +32 -0
  151. package/types/vendor/@akanjs/native/plugins/appearance/src/setting.d.ts +6 -0
  152. package/types/vendor/@akanjs/native/plugins/appearance/src/web.d.ts +3 -0
  153. package/types/vendor/@akanjs/native/plugins/appearance/src.d.ts +1 -0
  154. package/types/vendor/@akanjs/native/plugins/auth-session/src/args.d.ts +18 -0
  155. package/types/vendor/@akanjs/native/plugins/auth-session/src/desktop.d.ts +17 -0
  156. package/types/vendor/@akanjs/native/plugins/auth-session/src/index.d.ts +41 -0
  157. package/types/vendor/@akanjs/native/plugins/auth-session/src.d.ts +1 -0
  158. package/types/vendor/@akanjs/native/plugins/autostart/src/desktop.d.ts +44 -0
  159. package/types/vendor/@akanjs/native/plugins/autostart/src/index.d.ts +44 -0
  160. package/types/vendor/@akanjs/native/plugins/autostart/src.d.ts +1 -0
  161. package/types/vendor/@akanjs/native/plugins/badge/src/count.d.ts +4 -0
  162. package/types/vendor/@akanjs/native/plugins/badge/src/desktop.d.ts +3 -0
  163. package/types/vendor/@akanjs/native/plugins/badge/src/index.d.ts +37 -0
  164. package/types/vendor/@akanjs/native/plugins/badge/src/web.d.ts +2 -0
  165. package/types/vendor/@akanjs/native/plugins/badge/src.d.ts +1 -0
  166. package/types/vendor/@akanjs/native/plugins/biometric/src/index.d.ts +53 -0
  167. package/types/vendor/@akanjs/native/plugins/biometric/src.d.ts +1 -0
  168. package/types/vendor/@akanjs/native/plugins/browser/src/args.d.ts +8 -0
  169. package/types/vendor/@akanjs/native/plugins/browser/src/desktop.d.ts +9 -0
  170. package/types/vendor/@akanjs/native/plugins/browser/src/index.d.ts +36 -0
  171. package/types/vendor/@akanjs/native/plugins/browser/src/web.d.ts +2 -0
  172. package/types/vendor/@akanjs/native/plugins/browser/src.d.ts +1 -0
  173. package/types/vendor/@akanjs/native/plugins/camera/src/desktop.d.ts +5 -0
  174. package/types/vendor/@akanjs/native/plugins/camera/src/index.d.ts +55 -0
  175. package/types/vendor/@akanjs/native/plugins/camera/src/web.d.ts +2 -0
  176. package/types/vendor/@akanjs/native/plugins/camera/src.d.ts +1 -0
  177. package/types/vendor/@akanjs/native/plugins/clipboard/src/desktop.d.ts +8 -0
  178. package/types/vendor/@akanjs/native/plugins/clipboard/src/index.d.ts +40 -0
  179. package/types/vendor/@akanjs/native/plugins/clipboard/src/web.d.ts +2 -0
  180. package/types/vendor/@akanjs/native/plugins/clipboard/src.d.ts +1 -0
  181. package/types/vendor/@akanjs/native/plugins/device/src/desktop.d.ts +33 -0
  182. package/types/vendor/@akanjs/native/plugins/device/src/index.d.ts +55 -0
  183. package/types/vendor/@akanjs/native/plugins/device/src/web.d.ts +22 -0
  184. package/types/vendor/@akanjs/native/plugins/device/src.d.ts +1 -0
  185. package/types/vendor/@akanjs/native/plugins/dialog/src/desktop.d.ts +3 -0
  186. package/types/vendor/@akanjs/native/plugins/dialog/src/index.d.ts +60 -0
  187. package/types/vendor/@akanjs/native/plugins/dialog/src/options.d.ts +29 -0
  188. package/types/vendor/@akanjs/native/plugins/dialog/src/web.d.ts +2 -0
  189. package/types/vendor/@akanjs/native/plugins/dialog/src.d.ts +1 -0
  190. package/types/vendor/@akanjs/native/plugins/dock/src/desktop.d.ts +3 -0
  191. package/types/vendor/@akanjs/native/plugins/dock/src/index.d.ts +46 -0
  192. package/types/vendor/@akanjs/native/plugins/dock/src.d.ts +1 -0
  193. package/types/vendor/@akanjs/native/plugins/file-picker/src/common.d.ts +33 -0
  194. package/types/vendor/@akanjs/native/plugins/file-picker/src/desktop.d.ts +9 -0
  195. package/types/vendor/@akanjs/native/plugins/file-picker/src/index.d.ts +84 -0
  196. package/types/vendor/@akanjs/native/plugins/file-picker/src/web.d.ts +6 -0
  197. package/types/vendor/@akanjs/native/plugins/file-picker/src.d.ts +1 -0
  198. package/types/vendor/@akanjs/native/plugins/filesystem/src/common.d.ts +49 -0
  199. package/types/vendor/@akanjs/native/plugins/filesystem/src/desktop.d.ts +8 -0
  200. package/types/vendor/@akanjs/native/plugins/filesystem/src/index.d.ts +123 -0
  201. package/types/vendor/@akanjs/native/plugins/filesystem/src/web.d.ts +2 -0
  202. package/types/vendor/@akanjs/native/plugins/filesystem/src.d.ts +1 -0
  203. package/types/vendor/@akanjs/native/plugins/geolocation/src/index.d.ts +93 -0
  204. package/types/vendor/@akanjs/native/plugins/geolocation/src/web.d.ts +11 -0
  205. package/types/vendor/@akanjs/native/plugins/geolocation/src.d.ts +1 -0
  206. package/types/vendor/@akanjs/native/plugins/global-shortcut/src/desktop.d.ts +3 -0
  207. package/types/vendor/@akanjs/native/plugins/global-shortcut/src/index.d.ts +52 -0
  208. package/types/vendor/@akanjs/native/plugins/global-shortcut/src.d.ts +1 -0
  209. package/types/vendor/@akanjs/native/plugins/haptics/src/index.d.ts +31 -0
  210. package/types/vendor/@akanjs/native/plugins/haptics/src/web.d.ts +2 -0
  211. package/types/vendor/@akanjs/native/plugins/haptics/src.d.ts +1 -0
  212. package/types/vendor/@akanjs/native/plugins/http/src/common.d.ts +71 -0
  213. package/types/vendor/@akanjs/native/plugins/http/src/desktop.d.ts +5 -0
  214. package/types/vendor/@akanjs/native/plugins/http/src/index.d.ts +104 -0
  215. package/types/vendor/@akanjs/native/plugins/http/src/web.d.ts +2 -0
  216. package/types/vendor/@akanjs/native/plugins/http/src.d.ts +1 -0
  217. package/types/vendor/@akanjs/native/plugins/iap/src/index.d.ts +171 -0
  218. package/types/vendor/@akanjs/native/plugins/iap/src.d.ts +1 -0
  219. package/types/vendor/@akanjs/native/plugins/keep-awake/src/desktop.d.ts +15 -0
  220. package/types/vendor/@akanjs/native/plugins/keep-awake/src/index.d.ts +33 -0
  221. package/types/vendor/@akanjs/native/plugins/keep-awake/src/web.d.ts +2 -0
  222. package/types/vendor/@akanjs/native/plugins/keep-awake/src.d.ts +1 -0
  223. package/types/vendor/@akanjs/native/plugins/keyboard/src/index.d.ts +42 -0
  224. package/types/vendor/@akanjs/native/plugins/keyboard/src/web.d.ts +2 -0
  225. package/types/vendor/@akanjs/native/plugins/keyboard/src.d.ts +1 -0
  226. package/types/vendor/@akanjs/native/plugins/local-notifications/src/desktop.d.ts +29 -0
  227. package/types/vendor/@akanjs/native/plugins/local-notifications/src/index.d.ts +126 -0
  228. package/types/vendor/@akanjs/native/plugins/local-notifications/src/schedule.d.ts +38 -0
  229. package/types/vendor/@akanjs/native/plugins/local-notifications/src/timers.d.ts +25 -0
  230. package/types/vendor/@akanjs/native/plugins/local-notifications/src/web.d.ts +4 -0
  231. package/types/vendor/@akanjs/native/plugins/local-notifications/src.d.ts +1 -0
  232. package/types/vendor/@akanjs/native/plugins/menu/src/desktop.d.ts +3 -0
  233. package/types/vendor/@akanjs/native/plugins/menu/src/index.d.ts +85 -0
  234. package/types/vendor/@akanjs/native/plugins/menu/src.d.ts +1 -0
  235. package/types/vendor/@akanjs/native/plugins/network/src/index.d.ts +22 -0
  236. package/types/vendor/@akanjs/native/plugins/network/src/web.d.ts +3 -0
  237. package/types/vendor/@akanjs/native/plugins/network/src.d.ts +1 -0
  238. package/types/vendor/@akanjs/native/plugins/opener/src/desktop.d.ts +14 -0
  239. package/types/vendor/@akanjs/native/plugins/opener/src/index.d.ts +33 -0
  240. package/types/vendor/@akanjs/native/plugins/opener/src/url.d.ts +16 -0
  241. package/types/vendor/@akanjs/native/plugins/opener/src/web.d.ts +2 -0
  242. package/types/vendor/@akanjs/native/plugins/opener/src.d.ts +1 -0
  243. package/types/vendor/@akanjs/native/plugins/preferences/src/desktop.d.ts +3 -0
  244. package/types/vendor/@akanjs/native/plugins/preferences/src/index.d.ts +26 -0
  245. package/types/vendor/@akanjs/native/plugins/preferences/src/web.d.ts +2 -0
  246. package/types/vendor/@akanjs/native/plugins/preferences/src.d.ts +1 -0
  247. package/types/vendor/@akanjs/native/plugins/push/src/index.d.ts +57 -0
  248. package/types/vendor/@akanjs/native/plugins/push/src.d.ts +1 -0
  249. package/types/vendor/@akanjs/native/plugins/screen/src/desktop.d.ts +3 -0
  250. package/types/vendor/@akanjs/native/plugins/screen/src/index.d.ts +70 -0
  251. package/types/vendor/@akanjs/native/plugins/screen/src/web.d.ts +18 -0
  252. package/types/vendor/@akanjs/native/plugins/screen/src.d.ts +1 -0
  253. package/types/vendor/@akanjs/native/plugins/screen-orientation/src/index.d.ts +32 -0
  254. package/types/vendor/@akanjs/native/plugins/screen-orientation/src/types.d.ts +8 -0
  255. package/types/vendor/@akanjs/native/plugins/screen-orientation/src/web.d.ts +3 -0
  256. package/types/vendor/@akanjs/native/plugins/screen-orientation/src.d.ts +1 -0
  257. package/types/vendor/@akanjs/native/plugins/secure-storage/src/desktop.d.ts +16 -0
  258. package/types/vendor/@akanjs/native/plugins/secure-storage/src/index.d.ts +39 -0
  259. package/types/vendor/@akanjs/native/plugins/secure-storage/src.d.ts +1 -0
  260. package/types/vendor/@akanjs/native/plugins/share/src/index.d.ts +55 -0
  261. package/types/vendor/@akanjs/native/plugins/share/src/options.d.ts +6 -0
  262. package/types/vendor/@akanjs/native/plugins/share/src/web.d.ts +5 -0
  263. package/types/vendor/@akanjs/native/plugins/share/src.d.ts +1 -0
  264. package/types/vendor/@akanjs/native/plugins/single-instance/src/desktop.d.ts +8 -0
  265. package/types/vendor/@akanjs/native/plugins/single-instance/src/index.d.ts +25 -0
  266. package/types/vendor/@akanjs/native/plugins/single-instance/src/socket.d.ts +46 -0
  267. package/types/vendor/@akanjs/native/plugins/single-instance/src.d.ts +1 -0
  268. package/types/vendor/@akanjs/native/plugins/splash-screen/src/index.d.ts +19 -0
  269. package/types/vendor/@akanjs/native/plugins/splash-screen/src/web.d.ts +4 -0
  270. package/types/vendor/@akanjs/native/plugins/splash-screen/src.d.ts +1 -0
  271. package/types/vendor/@akanjs/native/plugins/sqlite/src/common.d.ts +34 -0
  272. package/types/vendor/@akanjs/native/plugins/sqlite/src/desktop.d.ts +6 -0
  273. package/types/vendor/@akanjs/native/plugins/sqlite/src/index.d.ts +115 -0
  274. package/types/vendor/@akanjs/native/plugins/sqlite/src.d.ts +1 -0
  275. package/types/vendor/@akanjs/native/plugins/toast/src/index.d.ts +30 -0
  276. package/types/vendor/@akanjs/native/plugins/toast/src/queue.d.ts +23 -0
  277. package/types/vendor/@akanjs/native/plugins/toast/src/web.d.ts +2 -0
  278. package/types/vendor/@akanjs/native/plugins/toast/src.d.ts +1 -0
  279. package/types/vendor/@akanjs/native/plugins/tray/src/desktop.d.ts +3 -0
  280. package/types/vendor/@akanjs/native/plugins/tray/src/index.d.ts +113 -0
  281. package/types/vendor/@akanjs/native/plugins/tray/src.d.ts +1 -0
  282. package/types/vendor/@akanjs/native/plugins/updates/src/desktop.d.ts +4 -0
  283. package/types/vendor/@akanjs/native/plugins/updates/src/index.d.ts +68 -0
  284. package/types/vendor/@akanjs/native/plugins/updates/src.d.ts +1 -0
  285. package/types/vendor/@akanjs/native/plugins/window/src/desktop.d.ts +6 -0
  286. package/types/vendor/@akanjs/native/plugins/window/src/index.d.ts +185 -0
  287. package/types/vendor/@akanjs/native/plugins/window/src/web.d.ts +2 -0
  288. package/types/vendor/@akanjs/native/plugins/window/src.d.ts +1 -0
  289. package/types/vendor/@akanjs/native/plugins/window-state/src/desktop.d.ts +7 -0
  290. package/types/vendor/@akanjs/native/plugins/window-state/src/index.d.ts +33 -0
  291. package/types/vendor/@akanjs/native/plugins/window-state/src/state.d.ts +39 -0
  292. package/types/vendor/@akanjs/native/plugins/window-state/src.d.ts +1 -0
  293. package/types/webkit/index.d.ts +0 -2
  294. package/types/webkit/nativeNavigation.d.ts +25 -0
  295. package/types/webkit/nativePurchase.d.ts +37 -0
  296. package/types/webkit/useCamera.d.ts +13 -15
  297. package/types/webkit/useGeoLocation.d.ts +4 -5
  298. package/types/webkit/usePurchase.d.ts +12 -16
  299. package/ui/Link/Anchor.tsx +2 -5
  300. package/ui/System/Client.tsx +2 -6
  301. package/vendor/@akanjs/native/LICENSE +21 -0
  302. package/vendor/@akanjs/native/README.ko.md +88 -0
  303. package/vendor/@akanjs/native/README.md +93 -0
  304. package/vendor/@akanjs/native/THIRD_PARTY_NOTICES.md +237 -0
  305. package/vendor/@akanjs/native/native/android/maven.lock.json +1751 -0
  306. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeAcl.kt +243 -0
  307. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeActivity.kt +936 -0
  308. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeApplication.kt +189 -0
  309. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeAssetServer.kt +225 -0
  310. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeBridge.kt +444 -0
  311. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeCompat.kt +55 -0
  312. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeContract.kt +99 -0
  313. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeEd25519.kt +100 -0
  314. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeFileProvider.kt +71 -0
  315. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeKernel.kt +324 -0
  316. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativePlugin.kt +361 -0
  317. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeSpec.kt +100 -0
  318. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeUpdates.kt +305 -0
  319. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeVectors.kt +132 -0
  320. package/vendor/@akanjs/native/native/desktop/Cargo.lock +2565 -0
  321. package/vendor/@akanjs/native/native/desktop/Cargo.toml +49 -0
  322. package/vendor/@akanjs/native/native/desktop/build.rs +19 -0
  323. package/vendor/@akanjs/native/native/desktop/rust-toolchain.toml +7 -0
  324. package/vendor/@akanjs/native/native/desktop/src/accelerator.rs +466 -0
  325. package/vendor/@akanjs/native/native/desktop/src/autostart.rs +158 -0
  326. package/vendor/@akanjs/native/native/desktop/src/camera.rs +53 -0
  327. package/vendor/@akanjs/native/native/desktop/src/chrome.rs +710 -0
  328. package/vendor/@akanjs/native/native/desktop/src/contract.rs +105 -0
  329. package/vendor/@akanjs/native/native/desktop/src/devproxy.rs +234 -0
  330. package/vendor/@akanjs/native/native/desktop/src/dialog_args.rs +189 -0
  331. package/vendor/@akanjs/native/native/desktop/src/dock.rs +209 -0
  332. package/vendor/@akanjs/native/native/desktop/src/hotkey.rs +209 -0
  333. package/vendor/@akanjs/native/native/desktop/src/js_panels.rs +125 -0
  334. package/vendor/@akanjs/native/native/desktop/src/json.rs +272 -0
  335. package/vendor/@akanjs/native/native/desktop/src/keychain.rs +151 -0
  336. package/vendor/@akanjs/native/native/desktop/src/lib.rs +2185 -0
  337. package/vendor/@akanjs/native/native/desktop/src/linux/appearance.rs +177 -0
  338. package/vendor/@akanjs/native/native/desktop/src/linux/camera.rs +11 -0
  339. package/vendor/@akanjs/native/native/desktop/src/linux/clipboard.rs +48 -0
  340. package/vendor/@akanjs/native/native/desktop/src/linux/device.rs +9 -0
  341. package/vendor/@akanjs/native/native/desktop/src/linux/dialogs.rs +348 -0
  342. package/vendor/@akanjs/native/native/desktop/src/linux/dock.rs +146 -0
  343. package/vendor/@akanjs/native/native/desktop/src/linux/hotkey.rs +228 -0
  344. package/vendor/@akanjs/native/native/desktop/src/linux/keychain.rs +243 -0
  345. package/vendor/@akanjs/native/native/desktop/src/linux/menu.rs +445 -0
  346. package/vendor/@akanjs/native/native/desktop/src/linux/mod.rs +116 -0
  347. package/vendor/@akanjs/native/native/desktop/src/linux/notify.rs +211 -0
  348. package/vendor/@akanjs/native/native/desktop/src/linux/open.rs +79 -0
  349. package/vendor/@akanjs/native/native/desktop/src/linux/power.rs +155 -0
  350. package/vendor/@akanjs/native/native/desktop/src/linux/screen.rs +158 -0
  351. package/vendor/@akanjs/native/native/desktop/src/linux/tray.rs +604 -0
  352. package/vendor/@akanjs/native/native/desktop/src/menu.rs +517 -0
  353. package/vendor/@akanjs/native/native/desktop/src/navigation.rs +381 -0
  354. package/vendor/@akanjs/native/native/desktop/src/notify.rs +411 -0
  355. package/vendor/@akanjs/native/native/desktop/src/notify_schedule.rs +382 -0
  356. package/vendor/@akanjs/native/native/desktop/src/page_menu.rs +287 -0
  357. package/vendor/@akanjs/native/native/desktop/src/panels.rs +333 -0
  358. package/vendor/@akanjs/native/native/desktop/src/placement.rs +92 -0
  359. package/vendor/@akanjs/native/native/desktop/src/routes.rs +153 -0
  360. package/vendor/@akanjs/native/native/desktop/src/screen.rs +190 -0
  361. package/vendor/@akanjs/native/native/desktop/src/tray.rs +279 -0
  362. package/vendor/@akanjs/native/native/desktop/src/vectors.rs +126 -0
  363. package/vendor/@akanjs/native/native/desktop/src/win/appearance.rs +51 -0
  364. package/vendor/@akanjs/native/native/desktop/src/win/autostart.rs +77 -0
  365. package/vendor/@akanjs/native/native/desktop/src/win/camera.rs +34 -0
  366. package/vendor/@akanjs/native/native/desktop/src/win/clipboard.rs +106 -0
  367. package/vendor/@akanjs/native/native/desktop/src/win/device.rs +80 -0
  368. package/vendor/@akanjs/native/native/desktop/src/win/dialogs.rs +917 -0
  369. package/vendor/@akanjs/native/native/desktop/src/win/dock.rs +228 -0
  370. package/vendor/@akanjs/native/native/desktop/src/win/hotkey.rs +110 -0
  371. package/vendor/@akanjs/native/native/desktop/src/win/keychain.rs +103 -0
  372. package/vendor/@akanjs/native/native/desktop/src/win/menu.rs +500 -0
  373. package/vendor/@akanjs/native/native/desktop/src/win/mod.rs +100 -0
  374. package/vendor/@akanjs/native/native/desktop/src/win/msgwin.rs +86 -0
  375. package/vendor/@akanjs/native/native/desktop/src/win/notify.rs +334 -0
  376. package/vendor/@akanjs/native/native/desktop/src/win/open.rs +127 -0
  377. package/vendor/@akanjs/native/native/desktop/src/win/power.rs +64 -0
  378. package/vendor/@akanjs/native/native/desktop/src/win/registry.rs +87 -0
  379. package/vendor/@akanjs/native/native/desktop/src/win/screen.rs +127 -0
  380. package/vendor/@akanjs/native/native/desktop/src/win/tray.rs +280 -0
  381. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeAcl.swift +241 -0
  382. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeApp.swift +285 -0
  383. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeBridge.swift +407 -0
  384. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeContract.swift +106 -0
  385. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeKernel.swift +317 -0
  386. package/vendor/@akanjs/native/native/ios/Sources/AkanNativePlugin.swift +250 -0
  387. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeSchemeHandler.swift +209 -0
  388. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeShell.swift +161 -0
  389. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeSpec.swift +143 -0
  390. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeUpdates.swift +270 -0
  391. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeVectors.swift +155 -0
  392. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeViewController.swift +371 -0
  393. package/vendor/@akanjs/native/packages/cli/src/api.ts +600 -0
  394. package/vendor/@akanjs/native/packages/cli/src/commands/build.ts +101 -0
  395. package/vendor/@akanjs/native/packages/cli/src/commands/compat.ts +53 -0
  396. package/vendor/@akanjs/native/packages/cli/src/commands/dev.ts +249 -0
  397. package/vendor/@akanjs/native/packages/cli/src/commands/doctor.ts +536 -0
  398. package/vendor/@akanjs/native/packages/cli/src/commands/plugin.ts +164 -0
  399. package/vendor/@akanjs/native/packages/cli/src/commands/signing.ts +32 -0
  400. package/vendor/@akanjs/native/packages/cli/src/commands/test.ts +130 -0
  401. package/vendor/@akanjs/native/packages/cli/src/commands/toolchain.ts +143 -0
  402. package/vendor/@akanjs/native/packages/cli/src/commands/update.ts +168 -0
  403. package/vendor/@akanjs/native/packages/cli/src/config.ts +257 -0
  404. package/vendor/@akanjs/native/packages/cli/src/index.ts +77 -0
  405. package/vendor/@akanjs/native/packages/cli/src/lib/acl.ts +420 -0
  406. package/vendor/@akanjs/native/packages/cli/src/lib/apilevel.ts +245 -0
  407. package/vendor/@akanjs/native/packages/cli/src/lib/apk.ts +203 -0
  408. package/vendor/@akanjs/native/packages/cli/src/lib/args.ts +44 -0
  409. package/vendor/@akanjs/native/packages/cli/src/lib/boot.ts +73 -0
  410. package/vendor/@akanjs/native/packages/cli/src/lib/chrome.ts +89 -0
  411. package/vendor/@akanjs/native/packages/cli/src/lib/codegen.ts +1128 -0
  412. package/vendor/@akanjs/native/packages/cli/src/lib/compat.ts +185 -0
  413. package/vendor/@akanjs/native/packages/cli/src/lib/configkeys.ts +91 -0
  414. package/vendor/@akanjs/native/packages/cli/src/lib/csp.ts +198 -0
  415. package/vendor/@akanjs/native/packages/cli/src/lib/env.ts +257 -0
  416. package/vendor/@akanjs/native/packages/cli/src/lib/exec.ts +104 -0
  417. package/vendor/@akanjs/native/packages/cli/src/lib/googleservices.ts +53 -0
  418. package/vendor/@akanjs/native/packages/cli/src/lib/hmr.ts +534 -0
  419. package/vendor/@akanjs/native/packages/cli/src/lib/html.ts +63 -0
  420. package/vendor/@akanjs/native/packages/cli/src/lib/icons.ts +316 -0
  421. package/vendor/@akanjs/native/packages/cli/src/lib/image.ts +175 -0
  422. package/vendor/@akanjs/native/packages/cli/src/lib/iossigning.ts +295 -0
  423. package/vendor/@akanjs/native/packages/cli/src/lib/launch.ts +98 -0
  424. package/vendor/@akanjs/native/packages/cli/src/lib/log.ts +105 -0
  425. package/vendor/@akanjs/native/packages/cli/src/lib/manifestmerge.ts +107 -0
  426. package/vendor/@akanjs/native/packages/cli/src/lib/maven.ts +244 -0
  427. package/vendor/@akanjs/native/packages/cli/src/lib/names.ts +202 -0
  428. package/vendor/@akanjs/native/packages/cli/src/lib/native-plugins.ts +326 -0
  429. package/vendor/@akanjs/native/packages/cli/src/lib/nativeconfig.ts +68 -0
  430. package/vendor/@akanjs/native/packages/cli/src/lib/permissions.ts +80 -0
  431. package/vendor/@akanjs/native/packages/cli/src/lib/plist.ts +139 -0
  432. package/vendor/@akanjs/native/packages/cli/src/lib/png.ts +240 -0
  433. package/vendor/@akanjs/native/packages/cli/src/lib/prepare.ts +290 -0
  434. package/vendor/@akanjs/native/packages/cli/src/lib/privacy.ts +64 -0
  435. package/vendor/@akanjs/native/packages/cli/src/lib/project.ts +710 -0
  436. package/vendor/@akanjs/native/packages/cli/src/lib/root.ts +18 -0
  437. package/vendor/@akanjs/native/packages/cli/src/lib/routes.ts +3 -0
  438. package/vendor/@akanjs/native/packages/cli/src/lib/serve.ts +83 -0
  439. package/vendor/@akanjs/native/packages/cli/src/lib/signing.ts +117 -0
  440. package/vendor/@akanjs/native/packages/cli/src/lib/spec.ts +521 -0
  441. package/vendor/@akanjs/native/packages/cli/src/lib/toolchains.ts +579 -0
  442. package/vendor/@akanjs/native/packages/cli/src/lib/updates.ts +160 -0
  443. package/vendor/@akanjs/native/packages/cli/src/lib/vectors.ts +121 -0
  444. package/vendor/@akanjs/native/packages/cli/src/lib/xml.ts +72 -0
  445. package/vendor/@akanjs/native/packages/cli/src/platforms/android.ts +1320 -0
  446. package/vendor/@akanjs/native/packages/cli/src/platforms/desktop-update.ts +78 -0
  447. package/vendor/@akanjs/native/packages/cli/src/platforms/desktop.ts +279 -0
  448. package/vendor/@akanjs/native/packages/cli/src/platforms/index.ts +31 -0
  449. package/vendor/@akanjs/native/packages/cli/src/platforms/ios.ts +801 -0
  450. package/vendor/@akanjs/native/packages/cli/src/platforms/linux.ts +52 -0
  451. package/vendor/@akanjs/native/packages/cli/src/platforms/macos.ts +97 -0
  452. package/vendor/@akanjs/native/packages/cli/src/platforms/targets.ts +12 -0
  453. package/vendor/@akanjs/native/packages/cli/src/platforms/web-run.ts +69 -0
  454. package/vendor/@akanjs/native/packages/cli/src/platforms/web.ts +28 -0
  455. package/vendor/@akanjs/native/packages/cli/src/platforms/windows.ts +82 -0
  456. package/vendor/@akanjs/native/packages/core/contract.json +96 -0
  457. package/vendor/@akanjs/native/packages/core/src/acl.ts +272 -0
  458. package/vendor/@akanjs/native/packages/core/src/boot.ts +97 -0
  459. package/vendor/@akanjs/native/packages/core/src/contract.ts +100 -0
  460. package/vendor/@akanjs/native/packages/core/src/errors.ts +95 -0
  461. package/vendor/@akanjs/native/packages/core/src/files.ts +105 -0
  462. package/vendor/@akanjs/native/packages/core/src/index.ts +35 -0
  463. package/vendor/@akanjs/native/packages/core/src/kernel.ts +281 -0
  464. package/vendor/@akanjs/native/packages/core/src/live.ts +62 -0
  465. package/vendor/@akanjs/native/packages/core/src/mime.ts +8 -0
  466. package/vendor/@akanjs/native/packages/core/src/plugin.ts +358 -0
  467. package/vendor/@akanjs/native/packages/core/src/protocol.ts +194 -0
  468. package/vendor/@akanjs/native/packages/core/src/runtime.ts +520 -0
  469. package/vendor/@akanjs/native/packages/core/src/state.ts +46 -0
  470. package/vendor/@akanjs/native/packages/core/src/testing.ts +176 -0
  471. package/vendor/@akanjs/native/packages/core/src/version.ts +2 -0
  472. package/vendor/@akanjs/native/packages/core/src/veto.ts +55 -0
  473. package/vendor/@akanjs/native/packages/core/vectors/acl.json +57 -0
  474. package/vendor/@akanjs/native/packages/core/vectors/bridge.json +76 -0
  475. package/vendor/@akanjs/native/packages/core/vectors/ed25519.json +29 -0
  476. package/vendor/@akanjs/native/packages/core/vectors/ids.json +73 -0
  477. package/vendor/@akanjs/native/packages/core/vectors/navigation.json +75 -0
  478. package/vendor/@akanjs/native/packages/core/vectors/ranges.json +39 -0
  479. package/vendor/@akanjs/native/packages/core/vectors/retained.json +17 -0
  480. package/vendor/@akanjs/native/packages/core/vectors/routes.json +66 -0
  481. package/vendor/@akanjs/native/packages/core/vectors/scope.json +143 -0
  482. package/vendor/@akanjs/native/packages/desktop/src/deeplinks.ts +143 -0
  483. package/vendor/@akanjs/native/packages/desktop/src/delta.ts +174 -0
  484. package/vendor/@akanjs/native/packages/desktop/src/dispatcher.ts +679 -0
  485. package/vendor/@akanjs/native/packages/desktop/src/ffi.ts +76 -0
  486. package/vendor/@akanjs/native/packages/desktop/src/host.ts +355 -0
  487. package/vendor/@akanjs/native/packages/desktop/src/lifecycle.ts +142 -0
  488. package/vendor/@akanjs/native/packages/desktop/src/main.ts +133 -0
  489. package/vendor/@akanjs/native/packages/desktop/src/page-veto.ts +103 -0
  490. package/vendor/@akanjs/native/packages/desktop/src/paths.ts +59 -0
  491. package/vendor/@akanjs/native/packages/desktop/src/plugin.ts +232 -0
  492. package/vendor/@akanjs/native/packages/react/src/index.ts +23 -0
  493. package/vendor/@akanjs/native/plugins/accessibility/android/AccessibilityPlugin.kt +96 -0
  494. package/vendor/@akanjs/native/plugins/accessibility/ios/AccessibilityPlugin.swift +92 -0
  495. package/vendor/@akanjs/native/plugins/accessibility/native-plugin.json +21 -0
  496. package/vendor/@akanjs/native/plugins/accessibility/src/announce.ts +71 -0
  497. package/vendor/@akanjs/native/plugins/accessibility/src/index.ts +77 -0
  498. package/vendor/@akanjs/native/plugins/accessibility/src/web.ts +52 -0
  499. package/vendor/@akanjs/native/plugins/app/android/AppPlugin.kt +72 -0
  500. package/vendor/@akanjs/native/plugins/app/ios/AppPlugin.swift +52 -0
  501. package/vendor/@akanjs/native/plugins/app/native-plugin.json +21 -0
  502. package/vendor/@akanjs/native/plugins/app/src/desktop.ts +64 -0
  503. package/vendor/@akanjs/native/plugins/app/src/index.ts +77 -0
  504. package/vendor/@akanjs/native/plugins/app/src/web.ts +12 -0
  505. package/vendor/@akanjs/native/plugins/app-state/android/AppStatePlugin.kt +54 -0
  506. package/vendor/@akanjs/native/plugins/app-state/ios/AppStatePlugin.swift +58 -0
  507. package/vendor/@akanjs/native/plugins/app-state/native-plugin.json +17 -0
  508. package/vendor/@akanjs/native/plugins/app-state/src/index.ts +42 -0
  509. package/vendor/@akanjs/native/plugins/app-state/src/web.ts +33 -0
  510. package/vendor/@akanjs/native/plugins/appearance/android/AppearancePlugin.kt +133 -0
  511. package/vendor/@akanjs/native/plugins/appearance/ios/AppearancePlugin.swift +109 -0
  512. package/vendor/@akanjs/native/plugins/appearance/native-plugin.json +18 -0
  513. package/vendor/@akanjs/native/plugins/appearance/src/desktop.ts +133 -0
  514. package/vendor/@akanjs/native/plugins/appearance/src/index.ts +62 -0
  515. package/vendor/@akanjs/native/plugins/appearance/src/setting.ts +18 -0
  516. package/vendor/@akanjs/native/plugins/appearance/src/web.ts +25 -0
  517. package/vendor/@akanjs/native/plugins/auth-session/android/AuthSessionPlugin.kt +171 -0
  518. package/vendor/@akanjs/native/plugins/auth-session/ios/AuthSessionPlugin.swift +112 -0
  519. package/vendor/@akanjs/native/plugins/auth-session/native-plugin.json +19 -0
  520. package/vendor/@akanjs/native/plugins/auth-session/src/args.ts +62 -0
  521. package/vendor/@akanjs/native/plugins/auth-session/src/desktop.ts +133 -0
  522. package/vendor/@akanjs/native/plugins/auth-session/src/index.ts +39 -0
  523. package/vendor/@akanjs/native/plugins/autostart/native-plugin.json +10 -0
  524. package/vendor/@akanjs/native/plugins/autostart/src/desktop.ts +189 -0
  525. package/vendor/@akanjs/native/plugins/autostart/src/index.ts +51 -0
  526. package/vendor/@akanjs/native/plugins/badge/ios/BadgePlugin.swift +92 -0
  527. package/vendor/@akanjs/native/plugins/badge/native-plugin.json +15 -0
  528. package/vendor/@akanjs/native/plugins/badge/src/count.ts +12 -0
  529. package/vendor/@akanjs/native/plugins/badge/src/desktop.ts +24 -0
  530. package/vendor/@akanjs/native/plugins/badge/src/index.ts +40 -0
  531. package/vendor/@akanjs/native/plugins/badge/src/web.ts +37 -0
  532. package/vendor/@akanjs/native/plugins/biometric/android/BiometricPlugin.kt +179 -0
  533. package/vendor/@akanjs/native/plugins/biometric/ios/BiometricPlugin.swift +129 -0
  534. package/vendor/@akanjs/native/plugins/biometric/native-plugin.json +22 -0
  535. package/vendor/@akanjs/native/plugins/biometric/src/index.ts +100 -0
  536. package/vendor/@akanjs/native/plugins/browser/android/BrowserPlugin.kt +178 -0
  537. package/vendor/@akanjs/native/plugins/browser/ios/BrowserPlugin.swift +63 -0
  538. package/vendor/@akanjs/native/plugins/browser/native-plugin.json +22 -0
  539. package/vendor/@akanjs/native/plugins/browser/src/args.ts +34 -0
  540. package/vendor/@akanjs/native/plugins/browser/src/desktop.ts +40 -0
  541. package/vendor/@akanjs/native/plugins/browser/src/index.ts +47 -0
  542. package/vendor/@akanjs/native/plugins/browser/src/web.ts +60 -0
  543. package/vendor/@akanjs/native/plugins/camera/android/CameraPlugin.kt +365 -0
  544. package/vendor/@akanjs/native/plugins/camera/ios/CameraPlugin.swift +296 -0
  545. package/vendor/@akanjs/native/plugins/camera/native-plugin.json +32 -0
  546. package/vendor/@akanjs/native/plugins/camera/src/desktop.ts +27 -0
  547. package/vendor/@akanjs/native/plugins/camera/src/index.ts +85 -0
  548. package/vendor/@akanjs/native/plugins/camera/src/web.ts +267 -0
  549. package/vendor/@akanjs/native/plugins/clipboard/android/ClipboardPlugin.kt +51 -0
  550. package/vendor/@akanjs/native/plugins/clipboard/ios/ClipboardPlugin.swift +35 -0
  551. package/vendor/@akanjs/native/plugins/clipboard/native-plugin.json +17 -0
  552. package/vendor/@akanjs/native/plugins/clipboard/src/desktop.ts +66 -0
  553. package/vendor/@akanjs/native/plugins/clipboard/src/index.ts +72 -0
  554. package/vendor/@akanjs/native/plugins/clipboard/src/web.ts +69 -0
  555. package/vendor/@akanjs/native/plugins/device/android/DevicePlugin.kt +70 -0
  556. package/vendor/@akanjs/native/plugins/device/ios/DevicePlugin.swift +80 -0
  557. package/vendor/@akanjs/native/plugins/device/native-plugin.json +18 -0
  558. package/vendor/@akanjs/native/plugins/device/src/desktop.ts +276 -0
  559. package/vendor/@akanjs/native/plugins/device/src/index.ts +72 -0
  560. package/vendor/@akanjs/native/plugins/device/src/web.ts +162 -0
  561. package/vendor/@akanjs/native/plugins/dialog/android/DialogPlugin.kt +260 -0
  562. package/vendor/@akanjs/native/plugins/dialog/ios/DialogPlugin.swift +198 -0
  563. package/vendor/@akanjs/native/plugins/dialog/native-plugin.json +18 -0
  564. package/vendor/@akanjs/native/plugins/dialog/src/desktop.ts +80 -0
  565. package/vendor/@akanjs/native/plugins/dialog/src/index.ts +87 -0
  566. package/vendor/@akanjs/native/plugins/dialog/src/options.ts +111 -0
  567. package/vendor/@akanjs/native/plugins/dialog/src/web.ts +296 -0
  568. package/vendor/@akanjs/native/plugins/dock/native-plugin.json +10 -0
  569. package/vendor/@akanjs/native/plugins/dock/src/desktop.ts +34 -0
  570. package/vendor/@akanjs/native/plugins/dock/src/index.ts +46 -0
  571. package/vendor/@akanjs/native/plugins/file-picker/android/FilePickerPlugin.kt +316 -0
  572. package/vendor/@akanjs/native/plugins/file-picker/ios/FilePickerPlugin.swift +366 -0
  573. package/vendor/@akanjs/native/plugins/file-picker/native-plugin.json +18 -0
  574. package/vendor/@akanjs/native/plugins/file-picker/src/common.ts +125 -0
  575. package/vendor/@akanjs/native/plugins/file-picker/src/desktop.ts +164 -0
  576. package/vendor/@akanjs/native/plugins/file-picker/src/index.ts +187 -0
  577. package/vendor/@akanjs/native/plugins/file-picker/src/web.ts +158 -0
  578. package/vendor/@akanjs/native/plugins/filesystem/android/FilesystemPlugin.kt +561 -0
  579. package/vendor/@akanjs/native/plugins/filesystem/ios/FilesystemPlugin.swift +596 -0
  580. package/vendor/@akanjs/native/plugins/filesystem/native-plugin.json +45 -0
  581. package/vendor/@akanjs/native/plugins/filesystem/src/common.ts +150 -0
  582. package/vendor/@akanjs/native/plugins/filesystem/src/desktop.ts +438 -0
  583. package/vendor/@akanjs/native/plugins/filesystem/src/index.ts +179 -0
  584. package/vendor/@akanjs/native/plugins/filesystem/src/web.ts +334 -0
  585. package/vendor/@akanjs/native/plugins/geolocation/android/GeolocationPlugin.kt +360 -0
  586. package/vendor/@akanjs/native/plugins/geolocation/ios/GeolocationPlugin.swift +284 -0
  587. package/vendor/@akanjs/native/plugins/geolocation/native-plugin.json +23 -0
  588. package/vendor/@akanjs/native/plugins/geolocation/src/index.ts +155 -0
  589. package/vendor/@akanjs/native/plugins/geolocation/src/web.ts +132 -0
  590. package/vendor/@akanjs/native/plugins/global-shortcut/native-plugin.json +10 -0
  591. package/vendor/@akanjs/native/plugins/global-shortcut/src/desktop.ts +36 -0
  592. package/vendor/@akanjs/native/plugins/global-shortcut/src/index.ts +55 -0
  593. package/vendor/@akanjs/native/plugins/haptics/android/HapticsPlugin.kt +127 -0
  594. package/vendor/@akanjs/native/plugins/haptics/ios/HapticsPlugin.swift +127 -0
  595. package/vendor/@akanjs/native/plugins/haptics/native-plugin.json +19 -0
  596. package/vendor/@akanjs/native/plugins/haptics/src/index.ts +34 -0
  597. package/vendor/@akanjs/native/plugins/haptics/src/web.ts +53 -0
  598. package/vendor/@akanjs/native/plugins/http/android/HttpPlugin.kt +234 -0
  599. package/vendor/@akanjs/native/plugins/http/android/HttpUrl.kt +182 -0
  600. package/vendor/@akanjs/native/plugins/http/ios/HttpPlugin.swift +228 -0
  601. package/vendor/@akanjs/native/plugins/http/ios/HttpUrl.swift +166 -0
  602. package/vendor/@akanjs/native/plugins/http/native-plugin.json +27 -0
  603. package/vendor/@akanjs/native/plugins/http/src/common.ts +294 -0
  604. package/vendor/@akanjs/native/plugins/http/src/desktop.ts +69 -0
  605. package/vendor/@akanjs/native/plugins/http/src/index.ts +181 -0
  606. package/vendor/@akanjs/native/plugins/http/src/web.ts +40 -0
  607. package/vendor/@akanjs/native/plugins/iap/android/IapPlugin.kt +358 -0
  608. package/vendor/@akanjs/native/plugins/iap/ios/IapPlugin.swift +306 -0
  609. package/vendor/@akanjs/native/plugins/iap/native-plugin.json +28 -0
  610. package/vendor/@akanjs/native/plugins/iap/src/index.ts +206 -0
  611. package/vendor/@akanjs/native/plugins/keep-awake/android/KeepAwakePlugin.kt +48 -0
  612. package/vendor/@akanjs/native/plugins/keep-awake/ios/KeepAwakePlugin.swift +36 -0
  613. package/vendor/@akanjs/native/plugins/keep-awake/native-plugin.json +17 -0
  614. package/vendor/@akanjs/native/plugins/keep-awake/src/desktop.ts +127 -0
  615. package/vendor/@akanjs/native/plugins/keep-awake/src/index.ts +79 -0
  616. package/vendor/@akanjs/native/plugins/keep-awake/src/web.ts +78 -0
  617. package/vendor/@akanjs/native/plugins/keyboard/android/KeyboardPlugin.kt +77 -0
  618. package/vendor/@akanjs/native/plugins/keyboard/ios/KeyboardPlugin.swift +93 -0
  619. package/vendor/@akanjs/native/plugins/keyboard/native-plugin.json +18 -0
  620. package/vendor/@akanjs/native/plugins/keyboard/src/index.ts +78 -0
  621. package/vendor/@akanjs/native/plugins/keyboard/src/web.ts +57 -0
  622. package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotificationReceiver.kt +38 -0
  623. package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotifications.kt +284 -0
  624. package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotificationsPlugin.kt +248 -0
  625. package/vendor/@akanjs/native/plugins/local-notifications/ios/LocalNotificationsPlugin.swift +279 -0
  626. package/vendor/@akanjs/native/plugins/local-notifications/native-plugin.json +35 -0
  627. package/vendor/@akanjs/native/plugins/local-notifications/src/desktop.ts +196 -0
  628. package/vendor/@akanjs/native/plugins/local-notifications/src/index.ts +174 -0
  629. package/vendor/@akanjs/native/plugins/local-notifications/src/schedule.ts +164 -0
  630. package/vendor/@akanjs/native/plugins/local-notifications/src/timers.ts +72 -0
  631. package/vendor/@akanjs/native/plugins/local-notifications/src/web.ts +158 -0
  632. package/vendor/@akanjs/native/plugins/menu/native-plugin.json +10 -0
  633. package/vendor/@akanjs/native/plugins/menu/src/desktop.ts +52 -0
  634. package/vendor/@akanjs/native/plugins/menu/src/index.ts +107 -0
  635. package/vendor/@akanjs/native/plugins/network/android/NetworkPlugin.kt +124 -0
  636. package/vendor/@akanjs/native/plugins/network/ios/NetworkPlugin.swift +82 -0
  637. package/vendor/@akanjs/native/plugins/network/native-plugin.json +19 -0
  638. package/vendor/@akanjs/native/plugins/network/src/index.ts +59 -0
  639. package/vendor/@akanjs/native/plugins/network/src/web.ts +43 -0
  640. package/vendor/@akanjs/native/plugins/opener/android/OpenerPlugin.kt +81 -0
  641. package/vendor/@akanjs/native/plugins/opener/ios/OpenerPlugin.swift +83 -0
  642. package/vendor/@akanjs/native/plugins/opener/native-plugin.json +25 -0
  643. package/vendor/@akanjs/native/plugins/opener/src/desktop.ts +88 -0
  644. package/vendor/@akanjs/native/plugins/opener/src/index.ts +35 -0
  645. package/vendor/@akanjs/native/plugins/opener/src/url.ts +39 -0
  646. package/vendor/@akanjs/native/plugins/opener/src/web.ts +33 -0
  647. package/vendor/@akanjs/native/plugins/preferences/android/PreferencesPlugin.kt +44 -0
  648. package/vendor/@akanjs/native/plugins/preferences/ios/PreferencesPlugin.swift +47 -0
  649. package/vendor/@akanjs/native/plugins/preferences/native-plugin.json +18 -0
  650. package/vendor/@akanjs/native/plugins/preferences/src/desktop.ts +59 -0
  651. package/vendor/@akanjs/native/plugins/preferences/src/index.ts +75 -0
  652. package/vendor/@akanjs/native/plugins/preferences/src/web.ts +55 -0
  653. package/vendor/@akanjs/native/plugins/push/android/AkanNativeMessagingService.kt +17 -0
  654. package/vendor/@akanjs/native/plugins/push/android/PushPlugin.kt +257 -0
  655. package/vendor/@akanjs/native/plugins/push/ios/PushPlugin.swift +169 -0
  656. package/vendor/@akanjs/native/plugins/push/native-plugin.json +23 -0
  657. package/vendor/@akanjs/native/plugins/push/src/index.ts +73 -0
  658. package/vendor/@akanjs/native/plugins/screen/native-plugin.json +10 -0
  659. package/vendor/@akanjs/native/plugins/screen/src/desktop.ts +50 -0
  660. package/vendor/@akanjs/native/plugins/screen/src/index.ts +107 -0
  661. package/vendor/@akanjs/native/plugins/screen/src/web.ts +92 -0
  662. package/vendor/@akanjs/native/plugins/screen-orientation/android/ScreenOrientationPlugin.kt +113 -0
  663. package/vendor/@akanjs/native/plugins/screen-orientation/ios/ScreenOrientationPlugin.swift +150 -0
  664. package/vendor/@akanjs/native/plugins/screen-orientation/native-plugin.json +17 -0
  665. package/vendor/@akanjs/native/plugins/screen-orientation/src/index.ts +69 -0
  666. package/vendor/@akanjs/native/plugins/screen-orientation/src/types.ts +26 -0
  667. package/vendor/@akanjs/native/plugins/screen-orientation/src/web.ts +67 -0
  668. package/vendor/@akanjs/native/plugins/secure-storage/android/SecureStoragePlugin.kt +184 -0
  669. package/vendor/@akanjs/native/plugins/secure-storage/ios/SecureStoragePlugin.swift +145 -0
  670. package/vendor/@akanjs/native/plugins/secure-storage/native-plugin.json +18 -0
  671. package/vendor/@akanjs/native/plugins/secure-storage/src/desktop.ts +332 -0
  672. package/vendor/@akanjs/native/plugins/secure-storage/src/index.ts +33 -0
  673. package/vendor/@akanjs/native/plugins/share/android/SharePlugin.kt +218 -0
  674. package/vendor/@akanjs/native/plugins/share/ios/SharePlugin.swift +142 -0
  675. package/vendor/@akanjs/native/plugins/share/native-plugin.json +18 -0
  676. package/vendor/@akanjs/native/plugins/share/src/index.ts +87 -0
  677. package/vendor/@akanjs/native/plugins/share/src/options.ts +43 -0
  678. package/vendor/@akanjs/native/plugins/share/src/web.ts +116 -0
  679. package/vendor/@akanjs/native/plugins/single-instance/native-plugin.json +10 -0
  680. package/vendor/@akanjs/native/plugins/single-instance/src/desktop.ts +63 -0
  681. package/vendor/@akanjs/native/plugins/single-instance/src/index.ts +32 -0
  682. package/vendor/@akanjs/native/plugins/single-instance/src/socket.ts +248 -0
  683. package/vendor/@akanjs/native/plugins/splash-screen/android/SplashScreenPlugin.kt +19 -0
  684. package/vendor/@akanjs/native/plugins/splash-screen/ios/SplashScreenPlugin.swift +20 -0
  685. package/vendor/@akanjs/native/plugins/splash-screen/native-plugin.json +17 -0
  686. package/vendor/@akanjs/native/plugins/splash-screen/src/index.ts +24 -0
  687. package/vendor/@akanjs/native/plugins/splash-screen/src/web.ts +17 -0
  688. package/vendor/@akanjs/native/plugins/sqlite/android/SqlStatements.kt +121 -0
  689. package/vendor/@akanjs/native/plugins/sqlite/android/SqlitePlugin.kt +327 -0
  690. package/vendor/@akanjs/native/plugins/sqlite/ios/SqlitePlugin.swift +361 -0
  691. package/vendor/@akanjs/native/plugins/sqlite/native-plugin.json +18 -0
  692. package/vendor/@akanjs/native/plugins/sqlite/src/common.ts +221 -0
  693. package/vendor/@akanjs/native/plugins/sqlite/src/desktop.ts +140 -0
  694. package/vendor/@akanjs/native/plugins/sqlite/src/index.ts +114 -0
  695. package/vendor/@akanjs/native/plugins/toast/android/ToastPlugin.kt +27 -0
  696. package/vendor/@akanjs/native/plugins/toast/native-plugin.json +14 -0
  697. package/vendor/@akanjs/native/plugins/toast/src/index.ts +41 -0
  698. package/vendor/@akanjs/native/plugins/toast/src/queue.ts +77 -0
  699. package/vendor/@akanjs/native/plugins/toast/src/web.ts +130 -0
  700. package/vendor/@akanjs/native/plugins/tray/native-plugin.json +10 -0
  701. package/vendor/@akanjs/native/plugins/tray/src/desktop.ts +73 -0
  702. package/vendor/@akanjs/native/plugins/tray/src/index.ts +111 -0
  703. package/vendor/@akanjs/native/plugins/updates/android/UpdatesPlugin.kt +290 -0
  704. package/vendor/@akanjs/native/plugins/updates/ios/UpdatesPlugin.swift +292 -0
  705. package/vendor/@akanjs/native/plugins/updates/native-plugin.json +19 -0
  706. package/vendor/@akanjs/native/plugins/updates/src/desktop.ts +558 -0
  707. package/vendor/@akanjs/native/plugins/updates/src/index.ts +95 -0
  708. package/vendor/@akanjs/native/plugins/window/native-plugin.json +32 -0
  709. package/vendor/@akanjs/native/plugins/window/src/desktop.ts +170 -0
  710. package/vendor/@akanjs/native/plugins/window/src/index.ts +342 -0
  711. package/vendor/@akanjs/native/plugins/window/src/web.ts +43 -0
  712. package/vendor/@akanjs/native/plugins/window-state/native-plugin.json +10 -0
  713. package/vendor/@akanjs/native/plugins/window-state/src/desktop.ts +73 -0
  714. package/vendor/@akanjs/native/plugins/window-state/src/index.ts +35 -0
  715. package/vendor/@akanjs/native/plugins/window-state/src/state.ts +146 -0
  716. package/webkit/bootCsr.tsx +26 -14
  717. package/webkit/index.ts +0 -2
  718. package/webkit/nativeNavigation.ts +116 -0
  719. package/webkit/nativePurchase.ts +93 -0
  720. package/webkit/useCamera.tsx +76 -71
  721. package/webkit/useCsrValues.ts +10 -124
  722. package/webkit/useGeoLocation.tsx +11 -13
  723. package/webkit/usePurchase.tsx +68 -123
  724. package/capacitor.base.config.ts +0 -140
  725. package/client/capacitor.ts +0 -252
  726. package/types/capacitor.base.config.d.ts +0 -3
  727. package/types/client/capacitor.d.ts +0 -290
  728. package/types/webkit/useCodepush.d.ts +0 -16
  729. package/types/webkit/useContact.d.ts +0 -11
  730. package/webkit/useCodepush.tsx +0 -76
  731. package/webkit/useContact.tsx +0 -45
@@ -0,0 +1,500 @@
1
+ //! Menus on Windows (menu plugin, plugins.md §5): a Win32 menu bar on every window with its
2
+ //! accelerators, context menus, and the HMENUs of tray menus (tray.rs), from the item trees and
3
+ //! roles of chrome.rs, with the ops and events of menu.rs.
4
+ //!
5
+ //! Know-how from the references:
6
+ //! - One HMENU per window: a window destroys its menu when it goes, so one shared menu would break
7
+ //! the other windows (Electrobun shares one, electrobun/package/src/native/win/nativeWrapper.cpp:
8
+ //! 6142-6147). SetMenu, then DrawMenuBar (:13188-13189). The text after the tab is only the key
9
+ //! shown (:6893-6899).
10
+ //! - tao's window procedure has no WM_COMMAND case (tao-0.37.0/src/platform_impl/windows/
11
+ //! event_loop.rs:2187-2216) and menus send WM_COMMAND rather than post it, so the msg hook never
12
+ //! sees it: a window subclass (SetWindowSubclass, as wry subclasses the same window, wry-0.57.0/
13
+ //! src/webview2/mod.rs:1288-1358) takes menu (HIWORD 0) and accelerator (HIWORD 1) commands.
14
+ //! Electrobun only takes HIWORD 0 and so drops its accelerators (nativeWrapper.cpp:5964-5971).
15
+ //! - Command ids are 16 bits (WM_COMMAND's LOWORD, ACCEL.cmd): id = chrome.rs index + 1.
16
+ //! - Accelerators: keys typed into the page go to WebView2's browser process and never reach this
17
+ //! thread's message loop, so TranslateAcceleratorW in the msg hook (all Tauri does, tauri/crates/
18
+ //! tauri/src/app.rs:2472-2489) only works while a window of the app itself has the focus.
19
+ //! WebView2 raises AcceleratorKeyPressed for keys with Ctrl or Alt and keys that type nothing; a
20
+ //! match there is marked handled and posted as the accelerator's WM_COMMAND. The msg hook passes
21
+ //! the top-level window: msg.hwnd can be a child, whose WM_COMMAND would go nowhere.
22
+ //! - Context and tray menus: SetForegroundWindow before TrackPopupMenuEx(TPM_RETURNCMD) and a
23
+ //! WM_NULL after it, or the menu does not close when the user clicks elsewhere (Electrobun
24
+ //! nativeWrapper.cpp:13242-13271). closeAfterMs: a timer of the owner window ends the menu
25
+ //! (EndMenu) from inside TrackPopupMenu's modal loop.
26
+ //! - The page's editing roles: WebView2 has no editing-command API, so Copy sends Ctrl+C to the
27
+ //! focused page with SendInput (Electrobun fakes its Redo keys the same way, :5711-5741).
28
+ //!
29
+ //! No app menu by default: a Windows window has no menu bar unless the app sets one (macOS needs
30
+ //! its default menu for Cmd+C/V; WebView2 handles Ctrl+C/V itself).
31
+
32
+ use std::cell::{OnceCell, RefCell};
33
+
34
+ use tao::platform::windows::WindowExtWindows;
35
+ use windows::core::{w, HSTRING};
36
+ use windows::Win32::Foundation::{HWND, LPARAM, LRESULT, POINT, WPARAM};
37
+ use windows::Win32::Graphics::Gdi::ClientToScreen;
38
+ use windows::Win32::UI::Input::KeyboardAndMouse::{
39
+ GetKeyState, SendInput, INPUT, INPUT_0, INPUT_KEYBOARD, KEYBDINPUT, KEYBD_EVENT_FLAGS, KEYEVENTF_KEYUP, VIRTUAL_KEY, VK_CONTROL, VK_DELETE, VK_LWIN, VK_MENU,
40
+ VK_RWIN, VK_SHIFT,
41
+ };
42
+ use windows::Win32::UI::Shell::{DefSubclassProc, RemoveWindowSubclass, SetWindowSubclass};
43
+ use windows::Win32::UI::WindowsAndMessaging::{
44
+ AppendMenuW, CheckMenuItem, CreateAcceleratorTableW, CreateMenu, CreatePopupMenu, DestroyAcceleratorTable, DestroyMenu, DrawMenuBar, EndMenu, GetAncestor,
45
+ GetCursorPos, GetMenu, KillTimer, MessageBoxW, PostMessageW, RegisterWindowMessageW, SetForegroundWindow, SetMenu, SetTimer, TrackPopupMenuEx,
46
+ TranslateAcceleratorW, ACCEL, ACCEL_VIRT_FLAGS, GA_ROOT, HACCEL, HMENU, MB_ICONINFORMATION, MB_OK, MF_BYCOMMAND, MF_CHECKED, MF_GRAYED, MF_POPUP,
47
+ MF_SEPARATOR, MF_STRING, MF_UNCHECKED, MSG, TPM_RETURNCMD, TPM_RIGHTBUTTON, WM_CLOSE, WM_COMMAND, WM_KEYDOWN, WM_NCDESTROY, WM_NULL, WM_SYSKEYDOWN,
48
+ };
49
+
50
+ use crate::{
51
+ chrome::{self, Clicked, Edit, Node, Role, Source, Tree},
52
+ json::V,
53
+ };
54
+
55
+ /// SetWindowSubclass id; wry uses WM_USER+0x64 and +0x66 on the same window.
56
+ const SUBCLASS_ID: usize = 0x616B_616E; // "akan"
57
+ /// The closeAfterMs timer of a context menu.
58
+ const CLOSE_TIMER: usize = 0x6F6D;
59
+
60
+ /// A key of the accelerator table: virtual key, ACCEL flags (FVIRTKEY | FSHIFT | FCONTROL | FALT), command id.
61
+ #[derive(Clone, Copy)]
62
+ struct Key {
63
+ vk: u16,
64
+ flags: u8,
65
+ cmd: u16,
66
+ }
67
+
68
+ struct AppMenu {
69
+ tree: Tree,
70
+ keys: Vec<Key>,
71
+ accel: Option<HACCEL>,
72
+ }
73
+
74
+ thread_local! {
75
+ /// The shell's windows: (window id, HWND).
76
+ static WINDOWS: RefCell<Vec<(u32, HWND)>> = const { RefCell::new(Vec::new()) };
77
+ /// The app menu; None: no menu bar (the default).
78
+ static APP: RefCell<Option<AppMenu>> = const { RefCell::new(None) };
79
+ static APP_NAME: RefCell<String> = const { RefCell::new(String::new()) };
80
+ static BUTTON_CREATED: OnceCell<u32> = const { OnceCell::new() };
81
+ }
82
+
83
+ pub fn set_app_name(name: &str) {
84
+ APP_NAME.with(|n| {
85
+ if n.borrow().as_str() != name {
86
+ *n.borrow_mut() = name.to_string();
87
+ }
88
+ });
89
+ }
90
+
91
+ pub fn app_name() -> String {
92
+ APP_NAME.with(|n| n.borrow().clone())
93
+ }
94
+
95
+ /// The shell's windows (dock.rs).
96
+ pub fn hwnds() -> Vec<HWND> {
97
+ WINDOWS.with(|w| w.borrow().iter().map(|(_, hwnd)| *hwnd).collect())
98
+ }
99
+
100
+ fn window_id(hwnd: HWND) -> Option<u32> {
101
+ WINDOWS.with(|w| w.borrow().iter().find(|(_, h)| *h == hwnd).map(|(id, _)| *id))
102
+ }
103
+
104
+ /// "TaskbarButtonCreated", sent to a window when its taskbar button appears (dock.rs applies the
105
+ /// badge and progress then: before, the calls fail).
106
+ fn button_created() -> u32 {
107
+ BUTTON_CREATED.with(|m| *m.get_or_init(|| unsafe { RegisterWindowMessageW(w!("TaskbarButtonCreated")) }))
108
+ }
109
+
110
+ // ───────────────────────── building ─────────────────────────
111
+
112
+ /// The item's text: & would underline the next letter, and the key follows a tab.
113
+ fn text(label: &str, accel: Option<&crate::accelerator::Accelerator>) -> HSTRING {
114
+ let mut s = label.replace('&', "&&");
115
+ if let Some(a) = accel {
116
+ s.push('\t');
117
+ s.push_str(&a.win_label());
118
+ }
119
+ HSTRING::from(s)
120
+ }
121
+
122
+ fn append(menu: HMENU, nodes: &[Node]) -> Result<(), String> {
123
+ let fail = |e: windows::core::Error| format!("INTERNAL: cannot build the menu: {e}");
124
+ for node in nodes {
125
+ unsafe {
126
+ match node {
127
+ Node::Separator => AppendMenuW(menu, MF_SEPARATOR, 0, None).map_err(fail)?,
128
+ Node::Submenu { label, children, .. } => {
129
+ let sub = CreatePopupMenu().map_err(fail)?;
130
+ append(sub, children)?;
131
+ AppendMenuW(menu, MF_POPUP | MF_STRING, sub.0 as usize, &text(label, None)).map_err(fail)?;
132
+ }
133
+ Node::Command(c) => {
134
+ let mut flags = MF_STRING;
135
+ if !c.enabled {
136
+ flags |= MF_GRAYED;
137
+ }
138
+ if c.checked() == Some(true) {
139
+ flags |= MF_CHECKED;
140
+ }
141
+ AppendMenuW(menu, flags, c.index + 1, &text(&c.label, c.accelerator.as_ref())).map_err(fail)?;
142
+ }
143
+ }
144
+ }
145
+ }
146
+ Ok(())
147
+ }
148
+
149
+ /// A context or tray menu.
150
+ pub fn build_popup(tree: &Tree) -> Result<HMENU, String> {
151
+ let menu = unsafe { CreatePopupMenu() }.map_err(|e| format!("INTERNAL: cannot build the menu: {e}"))?;
152
+ if let Err(e) = append(menu, &tree.nodes) {
153
+ unsafe {
154
+ let _ = DestroyMenu(menu);
155
+ }
156
+ return Err(e);
157
+ }
158
+ Ok(menu)
159
+ }
160
+
161
+ fn build_bar(tree: &Tree) -> Result<HMENU, String> {
162
+ let bar = unsafe { CreateMenu() }.map_err(|e| format!("INTERNAL: cannot build the menu: {e}"))?;
163
+ if let Err(e) = append(bar, &tree.nodes) {
164
+ unsafe {
165
+ let _ = DestroyMenu(bar);
166
+ }
167
+ return Err(e);
168
+ }
169
+ Ok(bar)
170
+ }
171
+
172
+ fn keys(tree: &Tree) -> Vec<Key> {
173
+ let mut keys = Vec::new();
174
+ for c in tree.commands() {
175
+ let Some(a) = c.key() else { continue };
176
+ match (a.win_vk(), a.win_accel_flags(), u16::try_from(c.index + 1)) {
177
+ (Some(vk), Some(flags), Ok(cmd)) => keys.push(Key { vk, flags, cmd }),
178
+ // The Windows key cannot be in an accelerator table: the item shows it, it does not fire.
179
+ _ => log!("menu: {} has no Windows accelerator", a.canonical()),
180
+ }
181
+ }
182
+ keys
183
+ }
184
+
185
+ /// Puts `bar` on the window (None: no menu bar) and destroys the one it had.
186
+ fn put(hwnd: HWND, bar: Option<HMENU>) {
187
+ unsafe {
188
+ let old = GetMenu(hwnd);
189
+ let _ = SetMenu(hwnd, bar);
190
+ let _ = DrawMenuBar(hwnd);
191
+ if !old.is_invalid() {
192
+ let _ = DestroyMenu(old);
193
+ }
194
+ }
195
+ }
196
+
197
+ fn set_app(tree: Option<Tree>) -> Result<(), String> {
198
+ if tree.as_ref().is_some_and(|t| t.commands().len() >= u16::MAX as usize) {
199
+ return Err("the app menu has more than 65534 items".into());
200
+ }
201
+ let hwnds = hwnds();
202
+ for hwnd in &hwnds {
203
+ let bar = tree.as_ref().map(build_bar).transpose()?;
204
+ put(*hwnd, bar);
205
+ }
206
+ let app = tree.map(|tree| {
207
+ let keys = keys(&tree);
208
+ let accels: Vec<ACCEL> = keys.iter().map(|k| ACCEL { fVirt: ACCEL_VIRT_FLAGS(k.flags), key: k.vk, cmd: k.cmd }).collect();
209
+ let accel = if accels.is_empty() { None } else { unsafe { CreateAcceleratorTableW(&accels) }.ok() };
210
+ AppMenu { tree, keys, accel }
211
+ });
212
+ let old = APP.with(|a| std::mem::replace(&mut *a.borrow_mut(), app));
213
+ if let Some(accel) = old.and_then(|m| m.accel) {
214
+ unsafe {
215
+ let _ = DestroyAcceleratorTable(accel);
216
+ }
217
+ }
218
+ Ok(())
219
+ }
220
+
221
+ // ───────────────────────── windows ─────────────────────────
222
+
223
+ /// lib.rs open_window (through mod.rs), for every window.
224
+ pub fn window_opened(id: u32, window: &tao::window::Window, webview: &wry::WebView) {
225
+ let hwnd = HWND(window.hwnd() as *mut _);
226
+ unsafe {
227
+ let _ = SetWindowSubclass(hwnd, Some(subclass), SUBCLASS_ID, 0);
228
+ }
229
+ let _ = button_created();
230
+ WINDOWS.with(|w| w.borrow_mut().push((id, hwnd)));
231
+ let bar = APP.with(|a| a.borrow().as_ref().map(|m| build_bar(&m.tree)));
232
+ match bar {
233
+ Some(Ok(bar)) => put(hwnd, Some(bar)),
234
+ Some(Err(e)) => log!("window {id}: {e}"),
235
+ None => {}
236
+ }
237
+ watch_keys(hwnd, webview);
238
+ }
239
+
240
+ unsafe extern "system" fn subclass(hwnd: HWND, msg: u32, wparam: WPARAM, lparam: LPARAM, _id: usize, _data: usize) -> LRESULT {
241
+ match msg {
242
+ // From the menu (HIWORD 0) or an accelerator (HIWORD 1); controls send their HWND in lParam.
243
+ WM_COMMAND if lparam.0 == 0 && (wparam.0 >> 16) & 0xFFFF <= 1 => {
244
+ let cmd = (wparam.0 & 0xFFFF) as u16;
245
+ if cmd > 0 && command(Some(hwnd), cmd as usize - 1) {
246
+ return LRESULT(0);
247
+ }
248
+ }
249
+ WM_NCDESTROY => {
250
+ WINDOWS.with(|w| w.borrow_mut().retain(|(_, h)| *h != hwnd));
251
+ let _ = RemoveWindowSubclass(hwnd, Some(subclass), SUBCLASS_ID);
252
+ }
253
+ _ if msg == button_created() => super::dock::button_created(hwnd),
254
+ _ => {}
255
+ }
256
+ DefSubclassProc(hwnd, msg, wparam, lparam)
257
+ }
258
+
259
+ /// An app menu command, from window `hwnd` (None: menu.trigger without a window). false: not one.
260
+ fn command(hwnd: Option<HWND>, index: usize) -> bool {
261
+ let clicked = APP.with(|a| a.borrow_mut().as_mut().map(|m| m.tree.click(index, &Source::App)));
262
+ match clicked {
263
+ None => false,
264
+ Some(Clicked::Item { checked: Some(on) }) => {
265
+ let cmd = (index + 1) as u32;
266
+ for hwnd in hwnds() {
267
+ unsafe { CheckMenuItem(GetMenu(hwnd), cmd, (MF_BYCOMMAND | if on { MF_CHECKED } else { MF_UNCHECKED }).0) };
268
+ }
269
+ true
270
+ }
271
+ Some(Clicked::Role(role)) => {
272
+ perform(role, hwnd.and_then(window_id), hwnd, false);
273
+ true
274
+ }
275
+ Some(_) => true,
276
+ }
277
+ }
278
+
279
+ /// A standard item. `window`: the menu's window (None: the most recently focused one); `owner`:
280
+ /// the About box's parent; `tray`: a tray menu, where editing roles have no page.
281
+ pub fn perform(role: Role, window: Option<u32>, owner: Option<HWND>, tray: bool) {
282
+ match role {
283
+ Role::Quit => chrome::request_quit(),
284
+ Role::About => {
285
+ let name = app_name();
286
+ unsafe { MessageBoxW(owner, &HSTRING::from(name.as_str()), &HSTRING::from(format!("About {name}")), MB_OK | MB_ICONINFORMATION) };
287
+ }
288
+ r if r.is_window_role() => chrome::defer_window_role(r, window),
289
+ r => {
290
+ if let (Some(edit), false) = (r.edit(), tray) {
291
+ send_keys(edit);
292
+ }
293
+ }
294
+ }
295
+ }
296
+
297
+ fn key(vk: VIRTUAL_KEY, up: bool) -> INPUT {
298
+ INPUT {
299
+ r#type: INPUT_KEYBOARD,
300
+ Anonymous: INPUT_0 { ki: KEYBDINPUT { wVk: vk, wScan: 0, dwFlags: if up { KEYEVENTF_KEYUP } else { KEYBD_EVENT_FLAGS(0) }, time: 0, dwExtraInfo: 0 } },
301
+ }
302
+ }
303
+
304
+ /// The page's editing command as its keys, to the focused page.
305
+ fn send_keys(edit: Edit) {
306
+ let (vk, ctrl, shift) = match edit {
307
+ Edit::Undo => (VIRTUAL_KEY(b'Z' as u16), true, false),
308
+ Edit::Redo => (VIRTUAL_KEY(b'Y' as u16), true, false),
309
+ Edit::Cut => (VIRTUAL_KEY(b'X' as u16), true, false),
310
+ Edit::Copy => (VIRTUAL_KEY(b'C' as u16), true, false),
311
+ Edit::Paste => (VIRTUAL_KEY(b'V' as u16), true, false),
312
+ Edit::PastePlain => (VIRTUAL_KEY(b'V' as u16), true, true),
313
+ Edit::Delete => (VK_DELETE, false, false),
314
+ Edit::SelectAll => (VIRTUAL_KEY(b'A' as u16), true, false),
315
+ };
316
+ let mut inputs = Vec::new();
317
+ let mods: Vec<VIRTUAL_KEY> = [(ctrl, VK_CONTROL), (shift, VK_SHIFT)].iter().filter(|(on, _)| *on).map(|(_, k)| *k).collect();
318
+ inputs.extend(mods.iter().map(|k| key(*k, false)));
319
+ inputs.push(key(vk, false));
320
+ inputs.push(key(vk, true));
321
+ inputs.extend(mods.iter().rev().map(|k| key(*k, true)));
322
+ unsafe { SendInput(&inputs, std::mem::size_of::<INPUT>() as i32) };
323
+ }
324
+
325
+ /// `menu.windowRole` (chrome.rs defer_window_role): close asks the window as its close button does.
326
+ pub fn window_role(cmd: &V, window: &tao::window::Window) -> Result<String, String> {
327
+ let hwnd = HWND(window.hwnd() as *mut _);
328
+ chrome::window_role(cmd, window, || unsafe {
329
+ let _ = PostMessageW(Some(hwnd), WM_CLOSE, WPARAM(0), LPARAM(0));
330
+ })
331
+ }
332
+
333
+ // ───────────────────────── accelerators ─────────────────────────
334
+
335
+ fn down(vk: VIRTUAL_KEY) -> bool {
336
+ unsafe { GetKeyState(vk.0 as i32) < 0 }
337
+ }
338
+
339
+ /// The enabled app menu command for this key with the modifiers held now.
340
+ fn accelerator_for(vk: u16) -> Option<u16> {
341
+ if down(VK_LWIN) || down(VK_RWIN) {
342
+ return None;
343
+ }
344
+ let flags = 1 | (if down(VK_SHIFT) { 4 } else { 0 }) | (if down(VK_CONTROL) { 8 } else { 0 }) | (if down(VK_MENU) { 0x10 } else { 0 });
345
+ APP.with(|a| {
346
+ let app = a.borrow();
347
+ let app = app.as_ref()?;
348
+ let key = app.keys.iter().find(|k| k.vk == vk && k.flags == flags)?;
349
+ app.tree.command(key.cmd as usize - 1).filter(|c| c.enabled).map(|_| key.cmd)
350
+ })
351
+ }
352
+
353
+ /// Menu accelerators while the page has the focus: WebView2's AcceleratorKeyPressed.
354
+ fn watch_keys(hwnd: HWND, webview: &wry::WebView) {
355
+ use webview2_com::AcceleratorKeyPressedEventHandler;
356
+ use webview2_com::Microsoft::Web::WebView2::Win32::{COREWEBVIEW2_KEY_EVENT_KIND, COREWEBVIEW2_KEY_EVENT_KIND_KEY_DOWN, COREWEBVIEW2_KEY_EVENT_KIND_SYSTEM_KEY_DOWN};
357
+ use wry::WebViewExtWindows;
358
+ // The handler runs on this thread (the controller's); the window as a number.
359
+ let raw = hwnd.0 as isize;
360
+ let handler = AcceleratorKeyPressedEventHandler::create(Box::new(move |_, args| {
361
+ let Some(args) = args else { return Ok(()) };
362
+ unsafe {
363
+ let mut kind = COREWEBVIEW2_KEY_EVENT_KIND::default();
364
+ args.KeyEventKind(&mut kind)?;
365
+ if kind != COREWEBVIEW2_KEY_EVENT_KIND_KEY_DOWN && kind != COREWEBVIEW2_KEY_EVENT_KIND_SYSTEM_KEY_DOWN {
366
+ return Ok(());
367
+ }
368
+ let mut vk = 0u32;
369
+ args.VirtualKey(&mut vk)?;
370
+ if let Some(cmd) = u16::try_from(vk).ok().and_then(accelerator_for) {
371
+ args.SetHandled(true)?;
372
+ // Posted: the handler runs inside WebView2's input call.
373
+ let _ = PostMessageW(Some(HWND(raw as *mut _)), WM_COMMAND, WPARAM((1 << 16) | cmd as usize), LPARAM(0));
374
+ }
375
+ }
376
+ Ok(())
377
+ }));
378
+ let result = unsafe {
379
+ let mut token = 0;
380
+ webview.controller().add_AcceleratorKeyPressed(&handler, &mut token)
381
+ };
382
+ if let Err(e) = result {
383
+ log!("menu accelerators while the page has the focus: {e}");
384
+ }
385
+ }
386
+
387
+ /// The msg hook: accelerators while a window of the app itself has the focus.
388
+ pub fn translate(msg: *const MSG) -> bool {
389
+ let msg = unsafe { &*msg };
390
+ if msg.message != WM_KEYDOWN && msg.message != WM_SYSKEYDOWN {
391
+ return false;
392
+ }
393
+ let Some(accel) = APP.with(|a| a.borrow().as_ref().and_then(|m| m.accel)) else { return false };
394
+ let root = unsafe { GetAncestor(msg.hwnd, GA_ROOT) };
395
+ if window_id(root).is_none() {
396
+ return false;
397
+ }
398
+ // Sends WM_COMMAND to the subclass now; APP is not borrowed.
399
+ unsafe { TranslateAcceleratorW(root, accel, msg) != 0 }
400
+ }
401
+
402
+ // ───────────────────────── popups ─────────────────────────
403
+
404
+ unsafe extern "system" fn end_menu(hwnd: HWND, _msg: u32, id: usize, _time: u32) {
405
+ let _ = KillTimer(Some(hwnd), id);
406
+ let _ = EndMenu();
407
+ }
408
+
409
+ pub fn cursor() -> POINT {
410
+ let mut p = POINT::default();
411
+ unsafe {
412
+ let _ = GetCursorPos(&mut p);
413
+ }
414
+ p
415
+ }
416
+
417
+ /// Shows `menu` at `at` (screen pixels) and destroys it. Returns the chosen command's index.
418
+ pub fn track(menu: HMENU, owner: HWND, at: POINT, close_after_ms: Option<f64>) -> Option<usize> {
419
+ unsafe {
420
+ let _ = SetForegroundWindow(owner);
421
+ if let Some(ms) = close_after_ms {
422
+ SetTimer(Some(owner), CLOSE_TIMER, ms.min(u32::MAX as f64) as u32, Some(end_menu));
423
+ }
424
+ let cmd = TrackPopupMenuEx(menu, (TPM_RETURNCMD | TPM_RIGHTBUTTON).0, at.x, at.y, owner, None).0;
425
+ if close_after_ms.is_some() {
426
+ let _ = KillTimer(Some(owner), CLOSE_TIMER);
427
+ }
428
+ let _ = PostMessageW(Some(owner), WM_NULL, WPARAM(0), LPARAM(0));
429
+ let _ = DestroyMenu(menu);
430
+ (cmd > 0).then(|| cmd as usize - 1)
431
+ }
432
+ }
433
+
434
+ /// menu.popup { items, x?, y?, closeAfterMs? } over window `id`: returns when the menu closes,
435
+ /// after the chosen item's click event.
436
+ pub fn popup(cmd: &V, id: u32, win: &crate::Win) -> Result<String, String> {
437
+ let mut tree = chrome::parse(cmd.get("items").ok_or("items is required")?, &app_name())?;
438
+ let at = match (cmd.get("x").and_then(|v| v.as_f64()), cmd.get("y").and_then(|v| v.as_f64())) {
439
+ (Some(x), Some(y)) if x.is_finite() && y.is_finite() => Some((x, y)),
440
+ (None, None) => None,
441
+ _ => return Err("give both x and y (CSS px), or neither for the mouse position".into()),
442
+ };
443
+ let close_after = cmd.get("closeAfterMs").and_then(|v| v.as_f64()).filter(|ms| ms.is_finite() && *ms >= 0.0);
444
+ let hwnd = HWND(win.window.hwnd() as *mut _);
445
+ let point = match at {
446
+ // CSS px from the page's top-left, which is the client area's (wry sizes the webview to it).
447
+ Some((x, y)) => {
448
+ let scale = win.window.scale_factor();
449
+ let mut p = POINT { x: (x * scale).round() as i32, y: (y * scale).round() as i32 };
450
+ unsafe {
451
+ let _ = ClientToScreen(hwnd, &mut p);
452
+ }
453
+ p
454
+ }
455
+ None => cursor(),
456
+ };
457
+ let menu = build_popup(&tree)?;
458
+ if let Some(index) = track(menu, hwnd, point, close_after) {
459
+ if let Clicked::Role(role) = tree.click(index, &Source::Context(id)) {
460
+ perform(role, Some(id), Some(hwnd), false);
461
+ }
462
+ }
463
+ Ok("null".into())
464
+ }
465
+
466
+ // ───────────────────────── ops ─────────────────────────
467
+
468
+ /// menu.* shell ops that need no window; None for other ops (menu.popup, menu.windowRole: mod.rs window_op).
469
+ pub fn shell_op(op: &str, cmd: &V, app_name: &str) -> Option<Result<String, String>> {
470
+ if !op.starts_with("menu.") {
471
+ return None;
472
+ }
473
+ set_app_name(app_name);
474
+ let result = match op {
475
+ "menu.setApp" => cmd
476
+ .get("items")
477
+ .ok_or_else(|| "items is required".to_string())
478
+ .and_then(|items| chrome::parse_app_menu(items, app_name))
479
+ .and_then(|tree| set_app(Some(tree)))
480
+ .map(|()| "null".to_string()),
481
+ "menu.reset" => set_app(None).map(|()| "null".into()),
482
+ "menu.get" => Ok(APP.with(|a| a.borrow().as_ref().map_or_else(|| "[]".to_string(), |m| m.tree.to_json()))),
483
+ "menu.trigger" => match cmd.get("id").and_then(|v| v.as_str()) {
484
+ Some(id) => {
485
+ let index = APP.with(|a| a.borrow().as_ref().and_then(|m| m.tree.find(id)));
486
+ match index {
487
+ // As if chosen in the most recently opened window.
488
+ Some(index) => {
489
+ command(WINDOWS.with(|w| w.borrow().last().map(|(_, h)| *h)), index);
490
+ Ok("null".into())
491
+ }
492
+ None => Err(format!("no menu item {id:?}")),
493
+ }
494
+ }
495
+ None => Err("id must be a string".into()),
496
+ },
497
+ _ => return None,
498
+ };
499
+ Some(result)
500
+ }
@@ -0,0 +1,100 @@
1
+ //! Windows parts of the shell: the plugins' native side (as menu.rs, tray.rs, … are on macOS).
2
+ //! Win32 is reached through windows-rs, the crate tao and wry already use (only features are
3
+ //! added, like objc2 on macOS). lib.rs calls four entry points:
4
+ //! shell_op app-wide ops, answered at once on the main thread
5
+ //! window_op ops on one window (the `window` argument, else the primary window)
6
+ //! async_op ops answered later through crate::reply (dialogs, notifications, threads)
7
+ //! msg_hook every Win32 message before tao dispatches it (hotkeys, tray icon callbacks)
8
+
9
+ pub mod appearance;
10
+ pub mod autostart;
11
+ pub mod camera;
12
+ pub mod clipboard;
13
+ pub mod device;
14
+ pub mod dialogs;
15
+ mod dock;
16
+ mod hotkey;
17
+ pub mod keychain;
18
+ mod menu;
19
+ pub(crate) mod msgwin;
20
+ pub mod notify;
21
+ pub mod open;
22
+ pub mod power;
23
+ pub mod registry;
24
+ mod screen;
25
+ mod tray;
26
+
27
+ use std::ffi::c_void;
28
+
29
+ use tao::event_loop::EventLoopWindowTarget;
30
+ use windows::core::{HSTRING, PCWSTR};
31
+ use windows::Win32::UI::Shell::ShellExecuteW;
32
+ use windows::Win32::UI::WindowsAndMessaging::SW_SHOWNORMAL;
33
+
34
+ use crate::{json, Shell, UserEvent, Win, Windows};
35
+
36
+ /// App-wide ops. None: not one of this OS's ops.
37
+ pub fn shell_op(op: &str, cmd: &json::V, target: &EventLoopWindowTarget<UserEvent>, shell: &Shell) -> Option<Result<String, String>> {
38
+ // shell.handler: opener; power.*: keep-awake; autostart.*; camera.*; device.*, webview.version: device
39
+ open::shell_op(op, cmd)
40
+ .or_else(|| power::shell_op(op, &shell.title))
41
+ .or_else(|| autostart::shell_op(op, cmd))
42
+ .or_else(|| camera::shell_op(op))
43
+ .or_else(|| device::shell_op(op))
44
+ // keychain.*: secure-storage (the Credential Manager)
45
+ .or_else(|| keychain::shell_op(op, cmd))
46
+ // menu.*, tray.*, hotkey.*: global-shortcut; dock.*: dock and badge; screen.*
47
+ .or_else(|| menu::shell_op(op, cmd, &shell.title))
48
+ .or_else(|| tray::shell_op(op, cmd, &shell.app_dir, &shell.title))
49
+ .or_else(|| hotkey::shell_op(op, cmd))
50
+ .or_else(|| dock::shell_op(op, cmd))
51
+ .or_else(|| screen::shell_op(op, target))
52
+ }
53
+
54
+ /// Ops on one window. None: not handled here.
55
+ pub fn window_op(op: &str, cmd: &json::V, id: u32, win: &Win) -> Option<Result<String, String>> {
56
+ use tao::platform::windows::WindowExtWindows;
57
+ // menu.popup: context menus; menu.windowRole: a menu item's minimize, zoom, full screen or close
58
+ match op {
59
+ "menu.popup" => return Some(menu::popup(cmd, id, win)),
60
+ "menu.windowRole" => return Some(menu::window_role(cmd, &win.window)),
61
+ _ => {}
62
+ }
63
+ // clipboard.*: the window owns what the app copies
64
+ clipboard::window_op(op, cmd, win.window.hwnd())
65
+ }
66
+
67
+ /// Ops answered later through crate::reply. true: taken.
68
+ pub fn async_op(id: u64, json: &str, windows: &Windows) -> bool {
69
+ // shell.open: opener, browser, auth-session (ShellExecuteEx on a thread)
70
+ open::async_op(id, json)
71
+ // notify.*: local-notifications (toasts)
72
+ || notify::async_op(id, json, &windows.shell.app_dir)
73
+ // alert.* and panel.*: dialog and file-picker plugins
74
+ || dialogs::async_op(id, json, windows)
75
+ }
76
+
77
+ /// lib.rs open_window, for every window: the app menu bar, menu accelerators and taskbar state.
78
+ pub fn window_opened(id: u32, window: &tao::window::Window, webview: &wry::WebView) {
79
+ // menu.rs: the app menu bar, its accelerators in the page, the taskbar button's dock state
80
+ menu::window_opened(id, window, webview);
81
+ // The theme the app set (appearance plugin), for prefers-color-scheme in the new window.
82
+ appearance::apply(webview);
83
+ }
84
+
85
+ /// Every message of the main thread's queue before tao dispatches it. true: consumed.
86
+ pub fn msg_hook(msg: *const c_void) -> bool {
87
+ // App menu accelerators while a window of the app itself has the focus (menu.rs)
88
+ menu::translate(msg as *const windows::Win32::UI::WindowsAndMessaging::MSG)
89
+ }
90
+
91
+ /// Opens a URL (or file) with its default handler: the system browser for http and https.
92
+ pub fn open_url(url: &str) -> bool {
93
+ let result = unsafe { ShellExecuteW(None, &HSTRING::from("open"), &HSTRING::from(url), PCWSTR::null(), PCWSTR::null(), SW_SHOWNORMAL) };
94
+ // ShellExecute returns a value greater than 32 on success.
95
+ let ok = result.0 as isize > 32;
96
+ if !ok {
97
+ log!("cannot open {url}: ShellExecute returned {}", result.0 as isize);
98
+ }
99
+ ok
100
+ }
@@ -0,0 +1,86 @@
1
+ //! A hidden window of the main thread for the tray, global-shortcut and screen parts: tray icon
2
+ //! callbacks (tray.rs), WM_HOTKEY (hotkey.rs) and the broadcasts TaskbarCreated, WM_DISPLAYCHANGE
3
+ //! and WM_SETTINGCHANGE (screen.rs) arrive at its window procedure. So do WM_QUERYENDSESSION and
4
+ //! WM_ENDSESSION (sign-out, shutdown), which message-only windows never get: it is created at
5
+ //! startup for them (N5).
6
+ //!
7
+ //! - A top-level window, never shown, not HWND_MESSAGE: message-only windows get no broadcasts
8
+ //! (TaskbarCreated, sent when Explorer restarts, is how tray icons come back), and a tray menu's
9
+ //! owner has to become the foreground window. tao's own hidden window is a top-level
10
+ //! WS_EX_TOOLWINDOW for the same reasons (tao-0.37.0/src/platform_impl/windows/event_loop.rs:
11
+ //! 623-661).
12
+ //! - Not thread messages (a NULL window): the modal loops of menus, dialogs and window moves drop
13
+ //! those, so a hotkey pressed while a menu is open would be lost.
14
+
15
+ use std::cell::OnceCell;
16
+
17
+ use windows::core::w;
18
+ use windows::Win32::Foundation::{HWND, LPARAM, LRESULT, WPARAM};
19
+ use windows::Win32::System::LibraryLoader::GetModuleHandleW;
20
+ use windows::Win32::UI::WindowsAndMessaging::{
21
+ CreateWindowExW, DefWindowProcW, RegisterClassExW, RegisterWindowMessageW, SPI_SETWORKAREA, WINDOW_STYLE, WM_APP, WM_DISPLAYCHANGE, WM_ENDSESSION,
22
+ WM_HOTKEY, WM_QUERYENDSESSION, WM_SETTINGCHANGE, WNDCLASSEXW, WS_EX_TOOLWINDOW,
23
+ };
24
+
25
+ /// Tray icon callbacks (NOTIFYICONDATAW.uCallbackMessage).
26
+ pub const WM_TRAY: u32 = WM_APP + 0x0A1;
27
+
28
+ thread_local! {
29
+ /// The window (main thread), created on first use.
30
+ static WINDOW: OnceCell<isize> = const { OnceCell::new() };
31
+ static TASKBAR_CREATED: OnceCell<u32> = const { OnceCell::new() };
32
+ }
33
+
34
+ fn taskbar_created() -> u32 {
35
+ TASKBAR_CREATED.with(|m| *m.get_or_init(|| unsafe { RegisterWindowMessageW(w!("TaskbarCreated")) }))
36
+ }
37
+
38
+ unsafe extern "system" fn proc(hwnd: HWND, msg: u32, wparam: WPARAM, lparam: LPARAM) -> LRESULT {
39
+ match msg {
40
+ WM_TRAY => super::tray::callback(wparam.0 as u32, lparam.0 as u32),
41
+ WM_HOTKEY => super::hotkey::pressed(wparam.0 as i32),
42
+ WM_DISPLAYCHANGE => super::screen::changed(),
43
+ WM_SETTINGCHANGE if wparam.0 as u32 == SPI_SETWORKAREA.0 => super::screen::changed(),
44
+ _ if msg == taskbar_created() => super::tray::recreate(),
45
+ // Sign-out or shutdown asks: the host's beforeQuit vetoes decide nothing here (Windows does not
46
+ // wait for them), so allow it and tell the host, which runs its quit hooks.
47
+ WM_QUERYENDSESSION => {
48
+ crate::push_event(r#"{"type":"quitRequested","reason":"session"}"#);
49
+ return LRESULT(1);
50
+ }
51
+ // The session ends: after this returns Windows ends the process. Give the host's onQuit hooks
52
+ // (window-state, single-instance) a few seconds on its own thread.
53
+ WM_ENDSESSION if wparam.0 != 0 => {
54
+ crate::push_event(r#"{"type":"signal","signal":"session"}"#);
55
+ std::thread::sleep(std::time::Duration::from_secs(3));
56
+ }
57
+ _ => return DefWindowProcW(hwnd, msg, wparam, lparam),
58
+ }
59
+ LRESULT(0)
60
+ }
61
+
62
+ /// The window, created on first use (main thread).
63
+ pub fn hwnd() -> Result<HWND, String> {
64
+ let raw = WINDOW.with(|w| {
65
+ if let Some(raw) = w.get() {
66
+ return Ok(*raw);
67
+ }
68
+ let _ = taskbar_created();
69
+ let hwnd = unsafe {
70
+ let instance = GetModuleHandleW(None).map_err(|e| e.to_string())?;
71
+ let class = WNDCLASSEXW {
72
+ cbSize: std::mem::size_of::<WNDCLASSEXW>() as u32,
73
+ lpfnWndProc: Some(proc),
74
+ hInstance: instance.into(),
75
+ lpszClassName: w!("AkanNativeShellHelper"),
76
+ ..Default::default()
77
+ };
78
+ RegisterClassExW(&class);
79
+ CreateWindowExW(WS_EX_TOOLWINDOW, w!("AkanNativeShellHelper"), w!("akan-native"), WINDOW_STYLE(0), 0, 0, 0, 0, None, None, Some(instance.into()), None)
80
+ .map_err(|e| format!("INTERNAL: cannot create the helper window: {e}"))?
81
+ };
82
+ let _ = w.set(hwnd.0 as isize);
83
+ Ok::<isize, String>(hwnd.0 as isize)
84
+ })?;
85
+ Ok(HWND(raw as *mut _))
86
+ }