quickwin 1.3.0 → 2.1.0

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 (167) hide show
  1. package/README.en.md +18 -24
  2. package/README.md +17 -23
  3. package/examples/PdfCanvas.js +8 -37
  4. package/examples/PdfCanvas.tsx +11 -41
  5. package/examples/exec_server.js +20155 -1420
  6. package/examples/exec_server.tsx +489 -0
  7. package/examples/exec_server_worker.js +383 -33
  8. package/examples/exec_server_worker.ts +408 -30
  9. package/examples/pdf_preview2.js +25 -82
  10. package/examples/pdf_preview2.ts +27 -84
  11. package/examples/pdf_viewer.js +1424 -1180
  12. package/examples/pdf_viewer.tsx +16 -67
  13. package/examples/setres.js +22 -47
  14. package/examples/setres.ts +23 -57
  15. package/examples/test_gallery.js +1418 -1075
  16. package/examples/test_react_lazy.js +1391 -1059
  17. package/examples/test_react_listbox.js +1390 -1058
  18. package/examples/test_root_window.js +1384 -1052
  19. package/examples/test_tab.js +1391 -1059
  20. package/lib/abort.js +70 -0
  21. package/lib/abort.ts +69 -0
  22. package/lib/certs.js +219 -0
  23. package/lib/certs.ts +229 -0
  24. package/lib/exec-log.js +15 -0
  25. package/lib/exec-log.ts +30 -0
  26. package/lib/fetch.js +88 -7
  27. package/lib/fetch.ts +73 -7
  28. package/lib/ffi/bind.js +441 -0
  29. package/lib/ffi/bind.ts +539 -0
  30. package/lib/ffi/ctype.js +194 -0
  31. package/lib/ffi/ctype.ts +369 -0
  32. package/lib/ffi/index.js +6 -0
  33. package/lib/ffi/index.ts +6 -0
  34. package/lib/ffi/struct.js +490 -0
  35. package/lib/ffi/struct.ts +753 -0
  36. package/lib/http-common.js +43 -5
  37. package/lib/http-common.ts +48 -6
  38. package/lib/http-server.js +187 -29
  39. package/lib/http-server.ts +177 -26
  40. package/lib/react-qw/components/DateTimePicker.js +18 -37
  41. package/lib/react-qw/components/Input.js +3 -10
  42. package/lib/react-qw/components/Link.js +6 -19
  43. package/lib/react-qw/components/ListView.js +50 -154
  44. package/lib/react-qw/components/PathPicker.js +28 -88
  45. package/lib/react-qw/components/ScrollView.js +15 -8
  46. package/lib/react-qw/components/Slider.js +2 -1
  47. package/lib/react-qw/components/Tab.js +6 -22
  48. package/lib/react-qw/components/Tooltip.js +10 -21
  49. package/lib/react-qw/components/TreeView.js +8 -31
  50. package/lib/react-qw/index.js +5 -3
  51. package/lib/react-qw/index.ts +8 -3
  52. package/lib/react-qw/nmhdr.js +3 -24
  53. package/lib/react-qw/nmhdr.ts +5 -30
  54. package/lib/react-qw/props.js +7 -2
  55. package/lib/react-qw/props.ts +7 -3
  56. package/lib/react-qw/reconciler.js +23 -13
  57. package/lib/react-qw/reconciler.ts +22 -13
  58. package/lib/text-measure.js +20 -23
  59. package/lib/text-measure.ts +22 -26
  60. package/lib/websocket.js +44 -4
  61. package/lib/websocket.ts +40 -4
  62. package/lib/windows/advapi32.js +53 -0
  63. package/lib/windows/advapi32.ts +64 -0
  64. package/lib/windows/comctl32.js +18 -0
  65. package/lib/windows/comctl32.ts +19 -0
  66. package/lib/windows/comdlg32.js +8 -0
  67. package/lib/windows/comdlg32.ts +10 -0
  68. package/lib/windows/gdi32.js +392 -0
  69. package/lib/windows/gdi32.ts +420 -0
  70. package/lib/windows/kernel32.js +262 -0
  71. package/lib/windows/kernel32.ts +291 -0
  72. package/lib/windows/msimg32.js +38 -0
  73. package/lib/windows/msimg32.ts +45 -0
  74. package/lib/windows/ntdll.js +9 -0
  75. package/lib/windows/ntdll.ts +11 -0
  76. package/lib/windows/ole32.js +7 -0
  77. package/lib/windows/ole32.ts +9 -0
  78. package/lib/windows/psapi.js +32 -0
  79. package/lib/windows/psapi.ts +37 -0
  80. package/lib/windows/shell32.js +13 -0
  81. package/lib/windows/shell32.ts +16 -0
  82. package/lib/windows/structs.js +519 -0
  83. package/lib/windows/structs.ts +566 -0
  84. package/lib/windows/user32.js +572 -0
  85. package/lib/windows/user32.ts +607 -0
  86. package/lib/windows/version.js +29 -0
  87. package/lib/windows/version.ts +35 -0
  88. package/lib/windows/winspool.js +71 -0
  89. package/lib/windows/winspool.ts +80 -0
  90. package/package.json +1 -1
  91. package/quickwin.d.ts +31 -40
  92. package/quickwin_const.d.ts +137 -0
  93. package/qwin-nowasm-x86.exe +0 -0
  94. package/qwin-nowasm.exe +0 -0
  95. package/qwin-x86.exe +0 -0
  96. package/qwin.exe +0 -0
  97. package/test/bench_ffi_callraw.js +236 -0
  98. package/test/bench_ffi_callraw.ts +236 -0
  99. package/test/bench_ffi_overhead.js +139 -0
  100. package/test/bench_ffi_overhead.ts +141 -0
  101. package/test/bench_sendmessage.js +104 -0
  102. package/test/bench_sendmessage.ts +100 -0
  103. package/test/bench_sendmessage_nonnull.js +187 -0
  104. package/test/bench_sendmessage_nonnull.ts +188 -0
  105. package/test/run.js +19 -4
  106. package/test/run.ts +20 -5
  107. package/test/test_basic_fetch.js +29 -0
  108. package/test/test_basic_fetch.ts +26 -0
  109. package/test/test_ffi.js +27 -45
  110. package/test/test_ffi.ts +35 -54
  111. package/test/test_ffi_abi.js +290 -0
  112. package/test/test_ffi_abi.ts +274 -0
  113. package/test/test_ffi_array.js +116 -0
  114. package/test/test_ffi_array.ts +141 -0
  115. package/test/test_ffi_bind.js +620 -8
  116. package/test/test_ffi_bind.ts +630 -8
  117. package/test/test_ffi_struct.js +632 -88
  118. package/test/test_ffi_struct.ts +666 -91
  119. package/test/test_ffi_struct_layout.js +495 -0
  120. package/test/test_ffi_struct_layout.ts +543 -0
  121. package/test/test_ffi_user32.js +103 -0
  122. package/test/test_ffi_user32.ts +113 -0
  123. package/test/test_ffi_windows.js +101 -0
  124. package/test/test_ffi_windows.ts +113 -0
  125. package/test/test_files.js +102 -0
  126. package/test/test_files.ts +121 -0
  127. package/test/test_gdi_draw.js +681 -0
  128. package/test/test_gdi_draw.ts +725 -0
  129. package/test/test_helper.js +8 -1
  130. package/test/test_helper.ts +9 -1
  131. package/test/test_http_import.js +18 -0
  132. package/test/test_http_import.ts +19 -0
  133. package/test/test_http_server.js +73 -1
  134. package/test/test_http_server.ts +75 -1
  135. package/test/test_ipv6.js +2 -2
  136. package/test/test_ipv6.ts +2 -2
  137. package/test/test_net_fetch.js +74 -11
  138. package/test/test_net_fetch.ts +73 -10
  139. package/test/test_net_websocket.js +1 -1
  140. package/test/test_net_websocket.ts +1 -1
  141. package/test/test_printer.js +137 -0
  142. package/test/test_printer.ts +148 -0
  143. package/test/test_proc.js +141 -0
  144. package/test/test_proc.ts +163 -0
  145. package/test/test_react_complex.js +1401 -1069
  146. package/test/test_react_counter.js +1391 -1059
  147. package/test/test_react_flex.js +1411 -1072
  148. package/test/test_react_hidden.js +1394 -1062
  149. package/test/test_react_listview_link.js +1391 -1059
  150. package/test/test_react_notify.js +18638 -0
  151. package/test/test_react_render.js +1391 -1059
  152. package/test/test_registry.js +74 -0
  153. package/test/test_registry.ts +95 -0
  154. package/test/test_sysinfo.js +122 -0
  155. package/test/test_sysinfo.ts +141 -0
  156. package/test/test_wolfssl_read.js +45 -43
  157. package/test/test_wolfssl_read.ts +42 -40
  158. package/test/test_worker_net.js +35 -17
  159. package/test/test_worker_net.ts +27 -15
  160. package/tsconfig.json +1 -1
  161. package/examples/exec_server.ts +0 -80
  162. package/lib/ffi-bind.js +0 -85
  163. package/lib/ffi-bind.ts +0 -170
  164. package/lib/ffi-struct.js +0 -224
  165. package/lib/ffi-struct.ts +0 -239
  166. package/lib/win-common-structs.js +0 -39
  167. package/lib/win-common-structs.ts +0 -41
@@ -1367,9 +1367,9 @@ var require_scheduler_development = __commonJS({
1367
1367
  }
1368
1368
  return first;
1369
1369
  }
1370
- function compare(a, b) {
1371
- var diff = a.sortIndex - b.sortIndex;
1372
- return 0 !== diff ? diff : a.id - b.id;
1370
+ function compare(a, b6) {
1371
+ var diff = a.sortIndex - b6.sortIndex;
1372
+ return 0 !== diff ? diff : a.id - b6.id;
1373
1373
  }
1374
1374
  function advanceTimers(currentTime) {
1375
1375
  for (var timer = peek(timerQueue); null !== timer; ) {
@@ -1667,14 +1667,14 @@ var require_react_reconciler_development = __commonJS({
1667
1667
  throw Error("Unable to find node on an unmounted component.");
1668
1668
  return alternate !== fiber ? null : fiber;
1669
1669
  }
1670
- for (var a = fiber, b = alternate; ; ) {
1670
+ for (var a = fiber, b6 = alternate; ; ) {
1671
1671
  var parentA = a.return;
1672
1672
  if (null === parentA) break;
1673
1673
  var parentB = parentA.alternate;
1674
1674
  if (null === parentB) {
1675
- b = parentA.return;
1676
- if (null !== b) {
1677
- a = b;
1675
+ b6 = parentA.return;
1676
+ if (null !== b6) {
1677
+ a = b6;
1678
1678
  continue;
1679
1679
  }
1680
1680
  break;
@@ -1682,23 +1682,23 @@ var require_react_reconciler_development = __commonJS({
1682
1682
  if (parentA.child === parentB.child) {
1683
1683
  for (parentB = parentA.child; parentB; ) {
1684
1684
  if (parentB === a) return assertIsMounted(parentA), fiber;
1685
- if (parentB === b) return assertIsMounted(parentA), alternate;
1685
+ if (parentB === b6) return assertIsMounted(parentA), alternate;
1686
1686
  parentB = parentB.sibling;
1687
1687
  }
1688
1688
  throw Error("Unable to find node on an unmounted component.");
1689
1689
  }
1690
- if (a.return !== b.return) a = parentA, b = parentB;
1690
+ if (a.return !== b6.return) a = parentA, b6 = parentB;
1691
1691
  else {
1692
1692
  for (var didFindChild = false, _child = parentA.child; _child; ) {
1693
1693
  if (_child === a) {
1694
1694
  didFindChild = true;
1695
1695
  a = parentA;
1696
- b = parentB;
1696
+ b6 = parentB;
1697
1697
  break;
1698
1698
  }
1699
- if (_child === b) {
1699
+ if (_child === b6) {
1700
1700
  didFindChild = true;
1701
- b = parentA;
1701
+ b6 = parentA;
1702
1702
  a = parentB;
1703
1703
  break;
1704
1704
  }
@@ -1709,12 +1709,12 @@ var require_react_reconciler_development = __commonJS({
1709
1709
  if (_child === a) {
1710
1710
  didFindChild = true;
1711
1711
  a = parentB;
1712
- b = parentA;
1712
+ b6 = parentA;
1713
1713
  break;
1714
1714
  }
1715
- if (_child === b) {
1715
+ if (_child === b6) {
1716
1716
  didFindChild = true;
1717
- b = parentB;
1717
+ b6 = parentB;
1718
1718
  a = parentA;
1719
1719
  break;
1720
1720
  }
@@ -1726,7 +1726,7 @@ var require_react_reconciler_development = __commonJS({
1726
1726
  );
1727
1727
  }
1728
1728
  }
1729
- if (a.alternate !== b)
1729
+ if (a.alternate !== b6)
1730
1730
  throw Error(
1731
1731
  "Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue."
1732
1732
  );
@@ -15071,10 +15071,10 @@ var require_react_reconciler_development = __commonJS({
15071
15071
  setCurrentUpdatePriority(previousPriority), ReactSharedInternals.T = prevTransition;
15072
15072
  }
15073
15073
  };
15074
- exports2.discreteUpdates = function(fn, a, b, c, d) {
15074
+ exports2.discreteUpdates = function(fn, a, b6, c, d) {
15075
15075
  var prevTransition = ReactSharedInternals.T, previousPriority = getCurrentUpdatePriority();
15076
15076
  try {
15077
- return setCurrentUpdatePriority(2), ReactSharedInternals.T = null, fn(a, b, c, d);
15077
+ return setCurrentUpdatePriority(2), ReactSharedInternals.T = null, fn(a, b6, c, d);
15078
15078
  } finally {
15079
15079
  setCurrentUpdatePriority(previousPriority), ReactSharedInternals.T = prevTransition, executionContext === NoContext && (workInProgressRootRenderTargetTime = now$1() + RENDER_TIMEOUT_MS);
15080
15080
  }
@@ -15357,141 +15357,18 @@ var require_constants = __commonJS({
15357
15357
  var import_jsx_runtime16 = __toESM(require_jsx_runtime(), 1);
15358
15358
  var import_react18 = __toESM(require_react(), 1);
15359
15359
  import "../lib/polyfill.js";
15360
- import * as std from "std";
15360
+ import * as std2 from "std";
15361
15361
 
15362
15362
  // _build/lib/react-qw/index.js
15363
- import * as gui18 from "gui";
15364
-
15365
- // _build/lib/react-qw/reconciler.js
15366
- var import_react_reconciler = __toESM(require_react_reconciler(), 1);
15367
- var import_react = __toESM(require_react(), 1);
15368
- var import_constants = __toESM(require_constants(), 1);
15369
- import * as gui3 from "gui";
15370
- import * as os from "os";
15371
-
15372
- // _build/lib/react-qw/props.js
15373
- import * as gui from "gui";
15374
- function applyProps(instance, newProps, _oldProps) {
15375
- const hwnd = instance.hwnd;
15376
- instance.props = newProps;
15377
- const textVal = "text" in newProps ? newProps.text : typeof newProps.children === "string" ? newProps.children : typeof newProps.children === "number" ? String(newProps.children) : void 0;
15378
- if (textVal !== void 0) {
15379
- let cursor = -1;
15380
- if (instance.type === "EDIT") {
15381
- const sel = gui.SendMessage(hwnd, 176, 0, 0);
15382
- cursor = sel >>> 16;
15383
- }
15384
- gui.SetWindowText(hwnd, textVal);
15385
- if (instance.type === "EDIT" && cursor >= 0) {
15386
- gui.SendMessage(hwnd, 177, cursor, cursor);
15387
- }
15388
- }
15389
- if ("disabled" in newProps) {
15390
- gui.EnableWindow(hwnd, !newProps.disabled);
15391
- }
15392
- if ("hidden" in newProps) {
15393
- gui.ShowWindow(
15394
- hwnd,
15395
- newProps.hidden ? 0 : 5
15396
- /* gui.ShowWindowCmd.SHOW */
15397
- );
15398
- }
15399
- if ("visible" in newProps) {
15400
- gui.ShowWindow(
15401
- hwnd,
15402
- newProps.visible ? 5 : 0
15403
- /* gui.ShowWindowCmd.HIDE */
15404
- );
15405
- }
15406
- }
15407
-
15408
- // _build/lib/react-qw/layout.js
15409
- var DEFAULT_W = 100;
15410
- var DEFAULT_H = 30;
15411
- function calculateFlexLayout(flex, parentW, parentH, children) {
15412
- const dir = flex.flexDirection || "column";
15413
- const gap = flex.gap ?? 0;
15414
- const justify = flex.justifyContent || "flex-start";
15415
- const align = flex.alignItems || "stretch";
15416
- const isRow = dir === "row";
15417
- const n = children.length;
15418
- const mainSize = isRow ? "w" : "h";
15419
- const crossSize = isRow ? "h" : "w";
15420
- const mainPos = isRow ? "x" : "y";
15421
- const crossPos = isRow ? "y" : "x";
15422
- const mainDim = isRow ? "width" : "height";
15423
- const crossDim = isRow ? "height" : "width";
15424
- const pt = flex.paddingTop ?? flex.padding ?? 0;
15425
- const pr = flex.paddingRight ?? flex.padding ?? 0;
15426
- const pb = flex.paddingBottom ?? flex.padding ?? 0;
15427
- const pl = flex.paddingLeft ?? flex.padding ?? 0;
15428
- const mainPadding = isRow ? pl + pr : pt + pb;
15429
- const crossPadding = isRow ? pt + pb : pl + pr;
15430
- const parentMain = (isRow ? parentW : parentH) - mainPadding;
15431
- const parentCross = (isRow ? parentH : parentW) - crossPadding;
15432
- const sizes = children.map((c) => ({
15433
- w: typeof c.style.width === "number" ? c.style.width : DEFAULT_W,
15434
- h: typeof c.style.height === "number" ? c.style.height : DEFAULT_H
15435
- }));
15436
- const flexGrows = children.map((c) => c.style.flexGrow ?? 0);
15437
- const totalGrow = flexGrows.reduce((s, g) => s + g, 0);
15438
- const baseMain = sizes.reduce((s, c) => s + c[mainSize], 0);
15439
- let freeGrow = parentMain - baseMain - Math.max(0, n - 1) * gap;
15440
- if (totalGrow > 0 && freeGrow > 0) {
15441
- for (let i = 0; i < n; i++) {
15442
- sizes[i][mainSize] += freeGrow * flexGrows[i] / totalGrow;
15443
- }
15444
- }
15445
- const totalMain = sizes.reduce((s, c) => s + c[mainSize], 0);
15446
- const free = parentMain - totalMain - Math.max(0, n - 1) * gap;
15447
- let offset = 0, extraGap = 0;
15448
- if (justify === "flex-end")
15449
- offset = free;
15450
- else if (justify === "center")
15451
- offset = Math.max(0, free / 2);
15452
- else if (justify === "space-between" && n > 1)
15453
- extraGap = free / (n - 1);
15454
- else if (justify === "space-around") {
15455
- extraGap = free / n;
15456
- offset = extraGap / 2;
15457
- } else if (justify === "space-evenly") {
15458
- extraGap = free / (n + 1);
15459
- offset = extraGap;
15460
- }
15461
- let cursor = offset;
15462
- return sizes.map((sz, i) => {
15463
- const childCrossBase = sz[crossSize];
15464
- const childAlign = children[i].style.alignSelf ?? "auto";
15465
- const effectiveAlign = childAlign === "auto" ? align : childAlign;
15466
- let childMain = sz[mainSize];
15467
- let childCross = childCrossBase;
15468
- const res = { x: 0, y: 0, width: 0, height: 0 };
15469
- res[mainPos] = cursor;
15470
- res[crossPos] = 0;
15471
- res[mainDim] = childMain;
15472
- res[crossDim] = childCross;
15473
- if (effectiveAlign === "stretch") {
15474
- const hasExplicitCross = typeof children[i].style[crossDim] === "number";
15475
- if (!hasExplicitCross) {
15476
- res[crossDim] = parentCross;
15477
- res[crossPos] = 0;
15478
- }
15479
- } else if (effectiveAlign === "flex-end") {
15480
- res[crossPos] = parentCross - childCross;
15481
- } else if (effectiveAlign === "center") {
15482
- res[crossPos] = Math.max(0, (parentCross - childCross) / 2);
15483
- }
15484
- cursor += childMain + gap + extraGap;
15485
- return res;
15486
- });
15487
- }
15363
+ import * as gui17 from "gui";
15488
15364
 
15489
- // _build/lib/text-measure.js
15490
- import * as ffi2 from "ffi";
15491
- import * as gui2 from "gui";
15365
+ // _build/lib/windows/user32.js
15366
+ import * as os3 from "os";
15492
15367
 
15493
- // _build/lib/ffi-bind.js
15368
+ // _build/lib/ffi/bind.js
15494
15369
  import * as ffi from "ffi";
15370
+ import * as os2 from "os";
15371
+ import * as std from "std";
15495
15372
  import * as win from "win";
15496
15373
 
15497
15374
  // _build/lib/text-codec.js
@@ -15514,62 +15391,62 @@ function _normalizeLabel(label) {
15514
15391
  function _decodeUTF8(buf, fatal) {
15515
15392
  let out = "";
15516
15393
  for (let i = 0; i < buf.length; ) {
15517
- const b = buf[i++];
15518
- if (b < 128) {
15519
- out += String.fromCharCode(b);
15394
+ const b6 = buf[i++];
15395
+ if (b6 < 128) {
15396
+ out += String.fromCharCode(b6);
15520
15397
  continue;
15521
15398
  }
15522
- if (b < 192) {
15399
+ if (b6 < 192) {
15523
15400
  out += fatal ? (() => {
15524
15401
  throw new TypeError("unexpected continuation byte");
15525
15402
  })() : "\uFFFD";
15526
15403
  continue;
15527
15404
  }
15528
15405
  let c, min;
15529
- if (b < 224) {
15406
+ if (b6 < 224) {
15530
15407
  if (i >= buf.length) {
15531
15408
  out += fatal ? (() => {
15532
15409
  throw new TypeError("incomplete utf-8");
15533
15410
  })() : "\uFFFD";
15534
15411
  break;
15535
15412
  }
15536
- const b2 = buf[i++];
15537
- if ((b2 & 192) !== 128) {
15413
+ const b22 = buf[i++];
15414
+ if ((b22 & 192) !== 128) {
15538
15415
  out += "\uFFFD";
15539
15416
  continue;
15540
15417
  }
15541
- c = (b & 31) << 6 | b2 & 63;
15418
+ c = (b6 & 31) << 6 | b22 & 63;
15542
15419
  min = 128;
15543
- } else if (b < 240) {
15420
+ } else if (b6 < 240) {
15544
15421
  if (i + 1 >= buf.length) {
15545
15422
  out += fatal ? (() => {
15546
15423
  throw new TypeError("incomplete utf-8");
15547
15424
  })() : "\uFFFD";
15548
15425
  break;
15549
15426
  }
15550
- const b2 = buf[i++];
15551
- const b3 = buf[i++];
15552
- if ((b2 & 192) !== 128 || (b3 & 192) !== 128) {
15427
+ const b22 = buf[i++];
15428
+ const b32 = buf[i++];
15429
+ if ((b22 & 192) !== 128 || (b32 & 192) !== 128) {
15553
15430
  out += "\uFFFD";
15554
15431
  continue;
15555
15432
  }
15556
- c = (b & 15) << 12 | (b2 & 63) << 6 | b3 & 63;
15433
+ c = (b6 & 15) << 12 | (b22 & 63) << 6 | b32 & 63;
15557
15434
  min = 2048;
15558
- } else if (b < 248) {
15435
+ } else if (b6 < 248) {
15559
15436
  if (i + 2 >= buf.length) {
15560
15437
  out += fatal ? (() => {
15561
15438
  throw new TypeError("incomplete utf-8");
15562
15439
  })() : "\uFFFD";
15563
15440
  break;
15564
15441
  }
15565
- const b2 = buf[i++];
15566
- const b3 = buf[i++];
15567
- const b4 = buf[i++];
15568
- if ((b2 & 192) !== 128 || (b3 & 192) !== 128 || (b4 & 192) !== 128) {
15442
+ const b22 = buf[i++];
15443
+ const b32 = buf[i++];
15444
+ const b42 = buf[i++];
15445
+ if ((b22 & 192) !== 128 || (b32 & 192) !== 128 || (b42 & 192) !== 128) {
15569
15446
  out += "\uFFFD";
15570
15447
  continue;
15571
15448
  }
15572
- c = (b & 7) << 18 | (b2 & 63) << 12 | (b3 & 63) << 6 | b4 & 63;
15449
+ c = (b6 & 7) << 18 | (b22 & 63) << 12 | (b32 & 63) << 6 | b42 & 63;
15573
15450
  min = 65536;
15574
15451
  } else {
15575
15452
  out += fatal ? (() => {
@@ -15707,65 +15584,166 @@ if (typeof globalThis.TextEncoder === "undefined") {
15707
15584
  globalThis.TextEncoder = TextEncoderImpl;
15708
15585
  }
15709
15586
 
15710
- // _build/lib/ffi-bind.js
15711
- var KIND_TO_FFI = {
15712
- void: ffi.FFI_TYPE_VOID,
15713
- u8: ffi.FFI_TYPE_UINT8,
15714
- i8: ffi.FFI_TYPE_SINT8,
15715
- u16: ffi.FFI_TYPE_UINT16,
15716
- i16: ffi.FFI_TYPE_SINT16,
15717
- u32: ffi.FFI_TYPE_UINT32,
15718
- i32: ffi.FFI_TYPE_SINT32,
15719
- u64: ffi.FFI_TYPE_UINT64,
15720
- i64: ffi.FFI_TYPE_SINT64,
15721
- f32: ffi.FFI_TYPE_FLOAT,
15722
- f64: ffi.FFI_TYPE_DOUBLE,
15723
- ptr: ffi.FFI_TYPE_POINTER,
15724
- wstr: ffi.FFI_TYPE_POINTER
15587
+ // _build/lib/ffi/ctype.js
15588
+ import { bufferPtr } from "ffi";
15589
+ import * as os from "os";
15590
+ var C_BASIC_TYPE = [
15591
+ "void",
15592
+ "u8",
15593
+ "i8",
15594
+ "u16",
15595
+ "i16",
15596
+ "u32",
15597
+ "i32",
15598
+ "u64",
15599
+ "i64",
15600
+ "f32",
15601
+ "f64",
15602
+ "ptr"
15603
+ ];
15604
+ var PTR_TOKEN_RE = /^<([A-Za-z_]\w*|)>ptr(!|@[A-Za-z_]\w*)?$/;
15605
+ function isCPtrToken(t) {
15606
+ return PTR_TOKEN_RE.test(t);
15607
+ }
15608
+ var VAL_TOKEN_RE = /^<([A-Za-z_]\w*)>$/;
15609
+ function isCValToken(t) {
15610
+ return VAL_TOKEN_RE.test(t);
15611
+ }
15612
+ function valName(t) {
15613
+ const m = VAL_TOKEN_RE.exec(t);
15614
+ return m?.[1] || "";
15615
+ }
15616
+ function ptrName(t) {
15617
+ const m = PTR_TOKEN_RE.exec(t);
15618
+ return m?.[1] || "";
15619
+ }
15620
+ var cTokenToType = (t) => {
15621
+ if (isCPtrToken(t))
15622
+ return "ptr";
15623
+ if (isCValToken(t))
15624
+ throw new Error(`ffi: cTokenToType: by-value token "${t}" has no scalar slot type`);
15625
+ return t;
15725
15626
  };
15726
- var C_ALIAS = {
15727
- int: "i32",
15728
- long: "i32",
15729
- short: "i16",
15730
- char: "i8",
15731
- float: "f32",
15732
- double: "f64",
15733
- DWORD: "u32",
15734
- UINT: "u32",
15735
- ULONG: "u32",
15736
- LONG: "i32",
15737
- BOOL: "i32",
15738
- HRESULT: "i32",
15739
- SHORT: "i16",
15740
- USHORT: "u16",
15741
- BYTE: "u8",
15742
- LONG_PTR: "ptr",
15743
- ULONG_PTR: "ptr",
15744
- INT_PTR: "ptr",
15745
- UINT_PTR: "ptr",
15746
- DWORD_PTR: "ptr",
15747
- SIZE_T: "ptr",
15748
- WPARAM: "ptr",
15749
- LPARAM: "ptr",
15750
- HANDLE: "ptr",
15751
- HWND: "ptr",
15752
- HDC: "ptr",
15753
- HMODULE: "ptr",
15754
- HFONT: "ptr",
15755
- HBRUSH: "ptr",
15756
- HICON: "ptr",
15757
- HBITMAP: "ptr",
15758
- LPVOID: "ptr",
15759
- LPCVOID: "ptr",
15760
- LPCWSTR: "ptr",
15761
- PCWSTR: "ptr",
15762
- LPWSTR: "ptr"
15627
+ var PTR_SIZE = os.arch === "x64" ? 8 : 4;
15628
+ var SizeAlign = {
15629
+ u8: 1,
15630
+ i8: 1,
15631
+ u16: 2,
15632
+ i16: 2,
15633
+ u32: 4,
15634
+ i32: 4,
15635
+ u64: 8,
15636
+ i64: 8,
15637
+ f32: 4,
15638
+ f64: 8
15639
+ };
15640
+ var NULL = 0;
15641
+ function normToken(t) {
15642
+ if (isCPtrToken(t)) {
15643
+ const m = PTR_TOKEN_RE.exec(t);
15644
+ const name = m?.[1] || "";
15645
+ const mod = m?.[2];
15646
+ return mod?.startsWith("@") ? `<${name}>ptr` : t;
15647
+ }
15648
+ if (isCValToken(t))
15649
+ return t;
15650
+ const at = t.indexOf("@");
15651
+ const base = at >= 0 ? t.slice(0, at) : t;
15652
+ const suffixOk = at < 0 || /^[A-Za-z_]\w*$/.test(t.slice(at + 1));
15653
+ if (suffixOk && base !== "ptr" && C_BASIC_TYPE.includes(base))
15654
+ return base;
15655
+ throw new Error("Unknown token: " + t);
15656
+ }
15657
+ function readScalar(dv, off, k) {
15658
+ switch (k) {
15659
+ case "u8":
15660
+ return dv.getUint8(off);
15661
+ case "i8":
15662
+ return dv.getInt8(off);
15663
+ case "u16":
15664
+ return dv.getUint16(off, true);
15665
+ case "i16":
15666
+ return dv.getInt16(off, true);
15667
+ case "u32":
15668
+ return dv.getUint32(off, true);
15669
+ case "i32":
15670
+ return dv.getInt32(off, true);
15671
+ case "u64":
15672
+ return dv.getBigUint64(off, true);
15673
+ case "i64":
15674
+ return dv.getBigInt64(off, true);
15675
+ case "f32":
15676
+ return dv.getFloat32(off, true);
15677
+ case "f64":
15678
+ return dv.getFloat64(off, true);
15679
+ case "ptr": {
15680
+ return PTR_SIZE === 8 ? Number(dv.getBigInt64(off, true)) : dv.getInt32(off, true);
15681
+ }
15682
+ }
15683
+ }
15684
+ function writeScalar(dv, off, { k, v }) {
15685
+ switch (k) {
15686
+ case "u8":
15687
+ dv.setUint8(off, Number(v));
15688
+ break;
15689
+ case "i8":
15690
+ dv.setInt8(off, Number(v));
15691
+ break;
15692
+ case "u16":
15693
+ dv.setUint16(off, Number(v), true);
15694
+ break;
15695
+ case "i16":
15696
+ dv.setInt16(off, Number(v), true);
15697
+ break;
15698
+ case "u32":
15699
+ dv.setUint32(off, v >>> 0, true);
15700
+ break;
15701
+ case "i32":
15702
+ dv.setUint32(off, v >>> 0, true);
15703
+ break;
15704
+ case "u64":
15705
+ dv.setBigUint64(off, v, true);
15706
+ break;
15707
+ case "i64":
15708
+ dv.setBigInt64(off, v, true);
15709
+ break;
15710
+ case "f32":
15711
+ dv.setFloat32(off, v, true);
15712
+ break;
15713
+ case "f64":
15714
+ dv.setFloat64(off, v, true);
15715
+ break;
15716
+ case "ptr": {
15717
+ if (v == null) {
15718
+ throw new Error("ffi: got null/undefined for a ptr slot; pass the imported NULL constant for empty");
15719
+ }
15720
+ if (PTR_SIZE === 8)
15721
+ dv.setBigUint64(off, BigInt.asUintN(64, BigInt(v)), true);
15722
+ else
15723
+ dv.setUint32(off, v >>> 0, true);
15724
+ break;
15725
+ }
15726
+ }
15727
+ }
15728
+ function writeSlot(dv, off, e) {
15729
+ const { k, v } = e;
15730
+ if (k === "u8" || k === "i8" || k === "u16" || k === "i16") {
15731
+ dv.setUint32(off, Number(v) >>> 0, true);
15732
+ return;
15733
+ }
15734
+ writeScalar(dv, off, e);
15735
+ }
15736
+ var PtrArrayBuffer = class extends ArrayBuffer {
15737
+ ptr;
15738
+ constructor(byteLength) {
15739
+ super(byteLength);
15740
+ this.ptr = bufferPtr(this);
15741
+ }
15763
15742
  };
15764
- function normKind(t) {
15765
- const k = C_ALIAS[t] ?? t;
15766
- if (!(k in KIND_TO_FFI))
15767
- throw new Error(`ffi-bind: invalid kind "${t}"`);
15768
- return k;
15743
+
15744
+ // _build/lib/ffi/bind.js
15745
+ function valCodec(name, encoders) {
15746
+ return encoders[name];
15769
15747
  }
15770
15748
  var _dllCache = /* @__PURE__ */ new Map();
15771
15749
  function loadDll(dll) {
@@ -15780,77 +15758,1011 @@ function loadDll(dll) {
15780
15758
  }
15781
15759
  function parseSig(sig) {
15782
15760
  const parts = sig.split(" -> ");
15783
- const ret = parts[1];
15784
- if (ret === void 0 || parts.length > 2) {
15761
+ if (parts.length !== 2) {
15785
15762
  throw new Error(`ffi-bind: invalid signature "${sig}" (expected "arg1 arg2 -> ret")`);
15786
15763
  }
15787
- const retK = normKind(ret);
15788
- if (retK === "wstr")
15789
- throw new Error('ffi-bind: "wstr" cannot be a return type');
15790
- const tokens = (parts[0] ?? "") === "" ? [] : parts[0].split(" ");
15791
- const args = tokens.map((t) => normKind(t));
15792
- return { args, ret: retK };
15764
+ const rawArgs = parts[0].split(" ").filter((t) => t !== "");
15765
+ const argTokens = [];
15766
+ for (const raw of rawArgs) {
15767
+ const tok = normToken(raw);
15768
+ if (tok === "void") {
15769
+ throw new Error("Void can not in args");
15770
+ }
15771
+ argTokens.push(tok);
15772
+ }
15773
+ const retToken = normToken(parts[1]);
15774
+ if (isCValToken(retToken))
15775
+ throw new Error(`ffi-bind: "${sig}": by-value struct at the return position (<${valName(retToken)}>) is not supported \u2014 argument positions only; pass a struct out through an out-param slot instead (<N>ptr + caller buffer)`);
15776
+ return {
15777
+ argTokens,
15778
+ retToken,
15779
+ sig
15780
+ };
15793
15781
  }
15794
- function makeFn(proc, sig) {
15795
- const { args, ret } = parseSig(sig);
15796
- const argTypes = args.map((k) => KIND_TO_FFI[k]);
15797
- const retType = KIND_TO_FFI[ret];
15798
- return (...a) => {
15799
- const vals = args.map((k, i) => k === "wstr" ? new TextEncoder("utf-16le").encode(String(a[i]) + "\0").buffer : a[i]);
15800
- return ffi.ffiCall(proc, argTypes, vals, retType);
15782
+ function makeFn(proc, sig, encoders, decoders) {
15783
+ const ps = parseSig(sig);
15784
+ for (const t of ps.argTokens) {
15785
+ if (!isCValToken(t))
15786
+ continue;
15787
+ const name = valName(t);
15788
+ const codec = valCodec(name, encoders);
15789
+ if (!codec || typeof codec.encode !== "function")
15790
+ throw new Error(`ffi-bind: ${sig}: by-value position <${name}> has no registered layout (available: ${Object.keys(encoders).join(", ") || "none"})`);
15791
+ if (typeof codec.size !== "number" || codec.size < 1)
15792
+ throw new Error(`ffi-bind: ${sig}: by-value position <${name}> requires a struct layout with size >= 1 (got ${codec.size}; non-struct codecs expose no size)`);
15793
+ }
15794
+ return (...a) => callPacked(proc, ps, a, encoders, decoders);
15795
+ }
15796
+ var IA32_ARG_SIZE = {
15797
+ u8: 4,
15798
+ i8: 4,
15799
+ u16: 4,
15800
+ i16: 4,
15801
+ u32: 4,
15802
+ i32: 4,
15803
+ u64: 8,
15804
+ i64: 8,
15805
+ f32: 4,
15806
+ f64: 8,
15807
+ ptr: PTR_SIZE
15808
+ };
15809
+ var X64_MIN_SLOTS = 4;
15810
+ function callPacked(proc, { argTokens, retToken, sig }, args, encoders, decoders) {
15811
+ const is64 = os2.arch === "x64";
15812
+ const getWidth = (t, is642) => {
15813
+ if (isCValToken(t))
15814
+ throw new Error(`ffi-bind: getWidth: by-value token "${t}" (dispatched by widthOf)`);
15815
+ if (is642)
15816
+ return 8;
15817
+ if (isCPtrToken(t))
15818
+ return PTR_SIZE;
15819
+ return IA32_ARG_SIZE[t];
15801
15820
  };
15821
+ const widthOf = (t) => {
15822
+ if (isCValToken(t)) {
15823
+ if (is64)
15824
+ return 8;
15825
+ const layout = valCodec(valName(t), encoders);
15826
+ if (!layout)
15827
+ throw new Error(`ffi-bind: <${valName(t)}> by-value position has no registered layout`);
15828
+ const size = layout.size;
15829
+ return size % 4 === 0 ? size : size + 4 - size % 4;
15830
+ }
15831
+ return getWidth(t, is64);
15832
+ };
15833
+ let total = 0;
15834
+ for (const t of argTokens)
15835
+ total += widthOf(t);
15836
+ if (is64 && argTokens.length < X64_MIN_SLOTS)
15837
+ total = X64_MIN_SLOTS * 8;
15838
+ const argFrame = new ArrayBuffer(total);
15839
+ const dv = new DataView(argFrame);
15840
+ const held = [];
15841
+ let off = 0;
15842
+ for (let i = 0; i < argTokens.length; i++) {
15843
+ const argToken = argTokens[i];
15844
+ const nonnull = argToken.endsWith("!");
15845
+ const arg = args[i];
15846
+ if (isCPtrToken(argToken)) {
15847
+ const name = ptrName(argToken);
15848
+ if (typeof arg === "number") {
15849
+ if (nonnull && arg === 0)
15850
+ throw new Error(`ffi-bind: ${sig}: arg#${i + 1} <${name}>ptr! got 0 (null pointer forbidden here; the token marks this position non-null)`);
15851
+ writeSlot(dv, off, { k: "ptr", v: arg });
15852
+ } else {
15853
+ if (arg === null || arg === void 0) {
15854
+ throw new Error(`ffi-bind: <${name}>ptr got ${String(arg)}; pass the imported NULL constant for an empty pointer`);
15855
+ }
15856
+ const codec = encoders[name];
15857
+ if (!codec) {
15858
+ throw new Error(name === "" ? `ffi-bind: <>ptr expects number (NULL | Ptr), got ${typeof arg}; use <BYTE>ptr with a PtrArrayBuffer (new PtrArrayBuffer(n)), or ffi.bufferPtr(buf) for an address` : `ffi-bind: unknown layout "<${name}>ptr" (available: ${Object.keys(encoders).join(", ") || "none"})`);
15859
+ }
15860
+ if (!codec.encode) {
15861
+ throw new Error(`ffi-bind: <${name}>ptr has no encoder (out-only codec)`);
15862
+ }
15863
+ const buf = codec.encode(arg);
15864
+ held.push(buf);
15865
+ const p = buf.ptr;
15866
+ if (typeof p !== "number")
15867
+ throw new Error("ffi-bind: codec.encode must return a PtrArrayBuffer, got plain ArrayBuffer");
15868
+ if (nonnull && p === 0)
15869
+ throw new Error(`ffi-bind: ${sig}: arg#${i + 1} <${name}>ptr! encode produced 0 (null pointer forbidden here)`);
15870
+ writeSlot(dv, off, { k: "ptr", v: p });
15871
+ }
15872
+ } else if (isCValToken(argToken)) {
15873
+ const name = valName(argToken);
15874
+ const codec = valCodec(name, encoders);
15875
+ if (!codec)
15876
+ throw new Error(`ffi-bind: ${sig}: arg#${i + 1} <${name}> by-value position has no registered layout`);
15877
+ if (arg === null || arg === void 0)
15878
+ throw new Error(`ffi-bind: <${name}> value position got ${String(arg)}; pass a struct object (use <${name}>ptr to pass a pointer)`);
15879
+ const size = codec.size;
15880
+ if (!is64 || size <= 8 && (size & size - 1) === 0) {
15881
+ codec.encode(arg, argFrame, off);
15882
+ } else {
15883
+ const buf = new ArrayBuffer(size + 15);
15884
+ const base = ffi.bufferPtr(buf);
15885
+ const pad = (16 - base % 16) % 16;
15886
+ codec.encode(arg, buf, pad);
15887
+ held.push(buf);
15888
+ writeSlot(dv, off, { k: "ptr", v: base + pad });
15889
+ }
15890
+ } else {
15891
+ writeSlot(dv, off, { k: argToken, v: arg });
15892
+ }
15893
+ off += widthOf(argToken);
15894
+ }
15895
+ const retBuf = new ArrayBuffer(8);
15896
+ const retIsFp = retToken === "f32" || retToken === "f64";
15897
+ ffi.ffiCall(proc, argFrame, retBuf, retIsFp ? 1 : 0);
15898
+ const raw = readRet(cTokenToType(retToken), retBuf);
15899
+ if (retToken.endsWith("!") && raw === 0)
15900
+ throw new Error(`ffi-bind: ${sig}: return ${retToken} got 0 (the token promises C never returns null here)`);
15901
+ if (isCPtrToken(retToken) && raw !== 0) {
15902
+ const name = ptrName(retToken);
15903
+ if (name !== "") {
15904
+ const codec = decoders[name];
15905
+ if (codec?.decode)
15906
+ return codec.decode(raw);
15907
+ }
15908
+ }
15909
+ return raw;
15802
15910
  }
15803
- function bindLib(dll, map) {
15804
- const out = {};
15805
- const h = loadDll(dll);
15806
- for (const [name, sig] of Object.entries(map)) {
15807
- const proc = win.GetProcAddress(h, name);
15808
- if (!proc)
15809
- throw new Error(`ffi-bind: proc "${name}" not found in ${dll}`);
15810
- out[name] = makeFn(proc, sig);
15911
+ function readRet(ret, retBuf) {
15912
+ if (ret === "void")
15913
+ return void 0;
15914
+ return readScalar(new DataView(retBuf), 0, ret);
15915
+ }
15916
+ var WCHAR = {
15917
+ encode: (v) => {
15918
+ const u8 = new TextEncoder("utf-16le").encode(v + "\0");
15919
+ const out = new PtrArrayBuffer(u8.byteLength);
15920
+ new Uint8Array(out).set(u8);
15921
+ return out;
15922
+ },
15923
+ decode: (p) => {
15924
+ if (typeof p === "number") {
15925
+ let s2 = "";
15926
+ let addr = p;
15927
+ const start = addr;
15928
+ for (; ; ) {
15929
+ const lo = ffi.readByte(addr);
15930
+ const hi = ffi.readByte(addr + 1);
15931
+ if (lo === 0 && hi === 0)
15932
+ return s2;
15933
+ s2 += String.fromCharCode(lo | hi << 8);
15934
+ addr += 2;
15935
+ if (addr - start > 1 << 21) {
15936
+ throw new Error("ffi-bind: WCHAR decode exceeded 4MiB without NUL");
15937
+ }
15938
+ }
15939
+ }
15940
+ const u8 = new Uint8Array(p);
15941
+ const limit = u8.length & ~1;
15942
+ let s = "";
15943
+ for (let i = 0; i < limit; i += 2) {
15944
+ const c = u8[i] | u8[i + 1] << 8;
15945
+ if (c === 0)
15946
+ return s;
15947
+ s += String.fromCharCode(c);
15948
+ }
15949
+ return s;
15950
+ },
15951
+ alloc: (size = 256) => new PtrArrayBuffer(size * 2)
15952
+ };
15953
+ var BYTE = {
15954
+ encode: (v) => {
15955
+ if (!(v instanceof PtrArrayBuffer))
15956
+ throw new Error("ffi-bind: <BYTE>ptr wants a PtrArrayBuffer (new PtrArrayBuffer(n) / BYTE.alloc / struct.encode), not a plain ArrayBuffer");
15957
+ return v;
15958
+ },
15959
+ alloc: (byteLen) => new PtrArrayBuffer(byteLen)
15960
+ };
15961
+ var builtinCodecs = { WCHAR, BYTE };
15962
+ function bind(dll, name, sig, encoders, decoders) {
15963
+ const proc = win.GetProcAddress(loadDll(dll), name);
15964
+ if (!proc)
15965
+ throw new Error(`ffi-bind: proc "${name}" not found in ${dll}`);
15966
+ const effDec = decoders ?? encoders;
15967
+ return makeFn(proc, sig, { ...builtinCodecs, ...encoders }, { ...builtinCodecs, ...effDec ?? {} });
15968
+ }
15969
+ var leakRegistry = new FinalizationRegistry((held) => {
15970
+ std.printf('[ffi] closure leaked (GCed without dispose): sig="%s" ptr=0x%x\n', held.sig, held.ptr);
15971
+ });
15972
+
15973
+ // _build/lib/ffi/struct.js
15974
+ import * as ffi2 from "ffi";
15975
+ function alignUp(v, a) {
15976
+ return v + a - 1 & ~(a - 1);
15977
+ }
15978
+ var isCNumberToken = (t) => SizeAlign[t] !== void 0;
15979
+ function lower(v) {
15980
+ if (typeof v === "string") {
15981
+ const st = /^(u8|u16)\[(\d+)\]@(utf-8|utf-16le)$/.exec(v);
15982
+ if (st) {
15983
+ const length = Number(st[2]);
15984
+ if (!Number.isInteger(length) || length < 1)
15985
+ throw new Error(`ffi-struct: string length must be an integer >= 1, got ${length}`);
15986
+ const s2 = st[1] === "u8" ? 1 : 2;
15987
+ return { size: s2 * length, align: s2, type: { tag: "string", encoding: st[3] } };
15988
+ }
15989
+ const a = /^([^\[\]]+)\[(\d+)\]$/.exec(v);
15990
+ if (a) {
15991
+ const length = Number(a[2]);
15992
+ if (!Number.isInteger(length) || length < 1)
15993
+ throw new Error(`ffi-struct: array length must be an integer >= 1, got ${length}`);
15994
+ const el = lower(a[1]);
15995
+ if (el.type.tag === "bitfield")
15996
+ throw new Error("ffi-struct: bitfields cannot be array elements");
15997
+ return {
15998
+ size: el.size * length,
15999
+ align: el.align,
16000
+ type: { tag: "array", elementType: el.type, elementSize: el.size }
16001
+ };
16002
+ }
16003
+ const b6 = /^([A-Za-z_]\w*):(\d+)$/.exec(v);
16004
+ if (b6) {
16005
+ const rawUnit = b6[1];
16006
+ const unit = normToken(rawUnit);
16007
+ if (!isCNumberToken(unit) || unit === "f32" || unit === "f64")
16008
+ throw new Error(`ffi-struct: bitfield unit must be an integer type, got "${rawUnit}"`);
16009
+ const width = Number(b6[2]);
16010
+ const s2 = SizeAlign[unit];
16011
+ const cap = s2 * 8;
16012
+ if (!Number.isInteger(width) || width < 1)
16013
+ throw new Error(`ffi-struct: bitfield width must be an integer >= 1, got ${width}`);
16014
+ if (width > cap)
16015
+ throw new Error(`ffi-struct: bitfield width ${width} exceeds unit width ${cap}`);
16016
+ return { size: s2, align: s2, type: { tag: "bitfield", unit, bit: 0, width } };
16017
+ }
16018
+ const k = normToken(v);
16019
+ if (isCPtrToken(k))
16020
+ return { size: PTR_SIZE, align: PTR_SIZE, type: { tag: "basic", kind: "ptr" } };
16021
+ if (!isCNumberToken(k))
16022
+ throw new Error(`ffi-struct: unknown kind "${v}"`);
16023
+ const s = SizeAlign[k];
16024
+ return { size: s, align: s, type: { tag: "basic", kind: k } };
15811
16025
  }
15812
- return out;
16026
+ if (v && typeof v === "object") {
16027
+ const o = v;
16028
+ const tag = o["#"];
16029
+ if (tag === void 0)
16030
+ throw new Error(`ffi-struct: nested object value requires a '#' key ('struct' | 'union' | 'array')`);
16031
+ if (tag === "array" && "#pack" in o)
16032
+ throw new Error(`ffi-struct: '#pack' is only allowed on struct/union, got '${tag}'`);
16033
+ if (tag === "array") {
16034
+ const length = o["length"];
16035
+ if (!Number.isInteger(length) || length < 1)
16036
+ throw new Error(`ffi-struct: array length must be an integer >= 1, got ${String(length)}`);
16037
+ const el = lower(o["element"]);
16038
+ if (el.type.tag === "bitfield")
16039
+ throw new Error("ffi-struct: bitfields cannot be array elements");
16040
+ return {
16041
+ size: el.size * length,
16042
+ align: el.align,
16043
+ type: { tag: "array", elementType: el.type, elementSize: el.size }
16044
+ };
16045
+ }
16046
+ if (tag === "struct" || tag === "union") {
16047
+ const l = computeStructLayout(v);
16048
+ return { size: l.size, align: l.maxEffectiveAlign, type: { tag, fields: l.fields } };
16049
+ }
16050
+ throw new Error(`ffi-struct: unknown '#' declaration ${JSON.stringify(String(tag))}`);
16051
+ }
16052
+ throw new Error(`ffi-struct: invalid member value: ${String(v)}`);
16053
+ }
16054
+ function computeStructLayout(t) {
16055
+ const isStruct = t["#"] === "struct";
16056
+ const pack = t["#pack"] ?? 8;
16057
+ let maxEffectiveAlign = 1;
16058
+ let maxMemberSize = 0;
16059
+ const fields = [];
16060
+ let cursor = 0;
16061
+ let unitBase = -1;
16062
+ let unitBits = 0;
16063
+ let unitSize = 0;
16064
+ const flushUnit = () => {
16065
+ if (unitBase < 0)
16066
+ return;
16067
+ cursor = alignUp(unitBase + Math.ceil(unitBits / 8), unitSize);
16068
+ unitBase = -1;
16069
+ };
16070
+ for (const [rawName, v] of Object.entries(t)) {
16071
+ if (rawName.startsWith("#"))
16072
+ continue;
16073
+ const m = /^([^@]+)@(\d+)$/.exec(rawName);
16074
+ const name = m ? m[1] : rawName;
16075
+ const alignas = m ? Number(m[2]) : 0;
16076
+ const { size, align: natural, type } = lower(v);
16077
+ const nonnull = typeof v === "string" && v.endsWith("!");
16078
+ let align = natural;
16079
+ if (pack > 0)
16080
+ align = Math.min(pack, align);
16081
+ if (alignas)
16082
+ align = Math.max(align, alignas);
16083
+ if (type.tag === "bitfield") {
16084
+ if (name.startsWith("$"))
16085
+ throw new Error("ffi-struct: bitfield members must be named");
16086
+ if (!isStruct) {
16087
+ fields.push({ name, offset: 0, size, type: { ...type, bit: 0 } });
16088
+ maxEffectiveAlign = Math.max(maxEffectiveAlign, align);
16089
+ maxMemberSize = Math.max(maxMemberSize, size);
16090
+ continue;
16091
+ }
16092
+ const width = type.width;
16093
+ if (unitBase < 0 || size !== unitSize || unitBits + width > unitSize * 8) {
16094
+ if (unitBase >= 0)
16095
+ flushUnit();
16096
+ const offset2 = alignUp(cursor, align);
16097
+ unitBase = offset2;
16098
+ unitBits = 0;
16099
+ unitSize = size;
16100
+ }
16101
+ fields.push({
16102
+ name,
16103
+ offset: unitBase,
16104
+ // 单元基址(不是位域自己的地址)
16105
+ size,
16106
+ type: { ...type, bit: unitBits }
16107
+ });
16108
+ unitBits += width;
16109
+ maxEffectiveAlign = Math.max(maxEffectiveAlign, align);
16110
+ maxMemberSize = Math.max(maxMemberSize, size);
16111
+ continue;
16112
+ }
16113
+ flushUnit();
16114
+ const offset = alignUp(cursor, align);
16115
+ if (!name.startsWith("$")) {
16116
+ fields.push({ name, offset, size, type, ...nonnull ? { nonnull: true } : {} });
16117
+ } else {
16118
+ if (type.tag !== "struct" && type.tag !== "union")
16119
+ throw new Error(`ffi-struct: anonymous member "${name}" must be a struct/union`);
16120
+ for (const cf of type.fields)
16121
+ fields.push({ ...cf, offset: cf.offset + offset });
16122
+ }
16123
+ if (isStruct)
16124
+ cursor = offset + size;
16125
+ maxEffectiveAlign = Math.max(maxEffectiveAlign, align);
16126
+ maxMemberSize = Math.max(maxMemberSize, size);
16127
+ }
16128
+ flushUnit();
16129
+ return {
16130
+ size: isStruct ? alignUp(cursor, maxEffectiveAlign) : alignUp(maxMemberSize, maxEffectiveAlign),
16131
+ maxEffectiveAlign,
16132
+ fields
16133
+ };
16134
+ }
16135
+ function readUnitRaw(dv, off, unit) {
16136
+ const s = SizeAlign[unit];
16137
+ if (s === 1)
16138
+ return BigInt(dv.getUint8(off));
16139
+ if (s === 2)
16140
+ return BigInt(dv.getUint16(off, true));
16141
+ if (s === 4)
16142
+ return BigInt(dv.getUint32(off, true));
16143
+ return dv.getBigUint64(off, true);
16144
+ }
16145
+ function writeUnitRaw(dv, off, unit, v) {
16146
+ const s = SizeAlign[unit];
16147
+ if (s === 1) {
16148
+ dv.setUint8(off, Number(v & 0xffn));
16149
+ return;
16150
+ }
16151
+ if (s === 2) {
16152
+ dv.setUint16(off, Number(v & 0xffffn), true);
16153
+ return;
16154
+ }
16155
+ if (s === 4) {
16156
+ dv.setUint32(off, Number(v & 0xffffffffn), true);
16157
+ return;
16158
+ }
16159
+ dv.setBigUint64(off, v & 0xffffffffffffffffn, true);
16160
+ }
16161
+ function readBitfield(dv, off, t) {
16162
+ const w = BigInt(t.width);
16163
+ let v = readUnitRaw(dv, off, t.unit) >> BigInt(t.bit) & (1n << w) - 1n;
16164
+ if (t.unit[0] === "i" && v & 1n << w - 1n)
16165
+ v -= 1n << w;
16166
+ if (t.width > 53)
16167
+ return v;
16168
+ return Number(v);
16169
+ }
16170
+ function writeBitfield(dv, off, t, val) {
16171
+ const w = BigInt(t.width);
16172
+ const bit = BigInt(t.bit);
16173
+ const widthMask = (1n << w) - 1n;
16174
+ const posMask = widthMask << bit;
16175
+ const raw = readUnitRaw(dv, off, t.unit);
16176
+ const bits = (typeof val === "bigint" ? val : BigInt(Math.trunc(val))) & widthMask;
16177
+ writeUnitRaw(dv, off, t.unit, raw & ~posMask | bits << bit);
16178
+ }
16179
+ var stringEncoders = {
16180
+ "utf-8": new TextEncoder("utf-8"),
16181
+ "utf-16le": new TextEncoder("utf-16le")
16182
+ };
16183
+ var stringDecoders = {
16184
+ "utf-8": new TextDecoder("utf-8", { ignoreBOM: true }),
16185
+ "utf-16le": new TextDecoder("utf-16le", { ignoreBOM: true })
16186
+ };
16187
+ function readString(dv, off, size, enc) {
16188
+ const bytes = new Uint8Array(dv.buffer, dv.byteOffset + off, size);
16189
+ const unit = enc === "utf-16le" ? 2 : 1;
16190
+ let end = size;
16191
+ for (let i = 0; i + unit <= size; i += unit) {
16192
+ if (bytes[i] === 0 && (unit === 1 || bytes[i + 1] === 0)) {
16193
+ end = i;
16194
+ break;
16195
+ }
16196
+ }
16197
+ return stringDecoders[enc].decode(bytes.subarray(0, end));
16198
+ }
16199
+ function writeString(dv, off, size, enc, v) {
16200
+ const bytes = new Uint8Array(dv.buffer, dv.byteOffset + off, size);
16201
+ bytes.fill(0);
16202
+ const unit = enc === "utf-16le" ? 2 : 1;
16203
+ const cap = size - unit;
16204
+ if (cap <= 0)
16205
+ return;
16206
+ const src = stringEncoders[enc].encode(String(v ?? ""));
16207
+ bytes.set(src.subarray(0, Math.min(src.length, cap)));
16208
+ }
16209
+ function readArray(dv, off, size, t) {
16210
+ const count = t.elementSize > 0 ? size / t.elementSize : 0;
16211
+ const out = [];
16212
+ for (let i = 0; i < count; i++)
16213
+ out.push(readElement(dv, off + i * t.elementSize, t.elementType, t.elementSize));
16214
+ return out;
16215
+ }
16216
+ function writeArray(dv, off, size, t, v) {
16217
+ const count = t.elementSize > 0 ? size / t.elementSize : 0;
16218
+ const list = v ?? [];
16219
+ for (let i = 0; i < count; i++)
16220
+ writeElement(dv, off + i * t.elementSize, t.elementType, t.elementSize, list[i]);
16221
+ }
16222
+ function readElement(dv, off, t, size) {
16223
+ switch (t.tag) {
16224
+ case "basic":
16225
+ return readScalar(dv, off, t.kind);
16226
+ case "bitfield":
16227
+ return readBitfield(dv, off, t);
16228
+ case "string":
16229
+ return readString(dv, off, size, t.encoding);
16230
+ case "struct":
16231
+ case "union":
16232
+ return doDecode(dv, off, t.fields);
16233
+ case "array":
16234
+ return readArray(dv, off, size, t);
16235
+ }
16236
+ }
16237
+ function writeElement(dv, off, t, size, val) {
16238
+ switch (t.tag) {
16239
+ // TODO: remove this any
16240
+ case "basic":
16241
+ writeScalar(dv, off, { k: t.kind, v: val });
16242
+ break;
16243
+ // 直传(不 Number()):writeBitfield 的 val 是 number | bigint,
16244
+ // 64 位单元走 bigint,先 Number() 会把 >2^53 的位域值截断。
16245
+ case "bitfield":
16246
+ writeBitfield(dv, off, t, val ?? 0);
16247
+ break;
16248
+ case "string":
16249
+ writeString(dv, off, size, t.encoding, val);
16250
+ break;
16251
+ case "struct":
16252
+ case "union":
16253
+ doEncode(dv, off, t.fields, val ?? {});
16254
+ break;
16255
+ case "array":
16256
+ writeArray(dv, off, size, t, val);
16257
+ break;
16258
+ }
16259
+ }
16260
+ function doDecode(dv, base, fields) {
16261
+ const out = {};
16262
+ for (const f of fields) {
16263
+ const v = readElement(dv, base + f.offset, f.type, f.size);
16264
+ if (f.nonnull && v === 0)
16265
+ throw new Error(`ffi-struct: decode: '!' field "${f.name}" got 0 (C did not fill it, or decode was called on an unfilled slot)`);
16266
+ out[f.name] = v;
16267
+ }
16268
+ return out;
16269
+ }
16270
+ function doEncode(dv, base, fields, v) {
16271
+ for (const f of fields) {
16272
+ if (v[f.name] === void 0)
16273
+ continue;
16274
+ writeElement(dv, base + f.offset, f.type, f.size, v[f.name]);
16275
+ }
16276
+ }
16277
+ function createStruct(t) {
16278
+ const { fields, size, maxEffectiveAlign } = computeStructLayout(t);
16279
+ return {
16280
+ __struct: t,
16281
+ size,
16282
+ structAlign: maxEffectiveAlign,
16283
+ decode: (p) => {
16284
+ if (typeof p === "number")
16285
+ return doDecode(new DataView(ffi2.readBytes(p, size)), 0, fields);
16286
+ return doDecode(new DataView(p), 0, fields);
16287
+ },
16288
+ alloc: ((n) => {
16289
+ if (n !== void 0 && (!Number.isInteger(n) || n < 1))
16290
+ throw new Error(`ffi-struct: alloc(n) requires an integer n >= 1 (PAB(0) never escapes \u2014 pass NULL for an empty pointer position)`);
16291
+ return new PtrArrayBuffer(size * (n ?? 1));
16292
+ }),
16293
+ encode: ((v, buf, offset) => {
16294
+ if (v === void 0 || v === null)
16295
+ throw new Error(`ffi-struct: encode(v) requires an argument; use alloc() for a zeroed out-param slot`);
16296
+ const out = buf ?? new PtrArrayBuffer(size);
16297
+ doEncode(new DataView(out), offset ?? 0, fields, v);
16298
+ return out;
16299
+ }),
16300
+ offsetOf: (name) => {
16301
+ for (const f of fields)
16302
+ if (f.name === name)
16303
+ return f.offset;
16304
+ throw new Error(`ffi-struct: no field "${name}"`);
16305
+ }
16306
+ };
16307
+ }
16308
+ function buildDecl(kind, member, pack) {
16309
+ const decl = { "#": kind };
16310
+ if (pack !== void 0)
16311
+ decl["#pack"] = pack;
16312
+ for (const [k, v] of Object.entries(member))
16313
+ if (!k.startsWith("#"))
16314
+ decl[k] = v;
16315
+ return decl;
16316
+ }
16317
+ function structArray(def) {
16318
+ const { fields, size } = computeStructLayout(def.__struct);
16319
+ const readN = (dv, n) => {
16320
+ const out = [];
16321
+ for (let i = 0; i < n; i++)
16322
+ out.push(doDecode(dv, i * size, fields));
16323
+ return out;
16324
+ };
16325
+ return {
16326
+ encode: (els) => {
16327
+ if (!Array.isArray(els) || els.length === 0)
16328
+ throw new Error(`ffi-struct: structArray(def).encode(els) requires a non-empty element array (pass NULL for an empty pointer position)`);
16329
+ const out = def.alloc(els.length);
16330
+ for (let i = 0; i < els.length; i++)
16331
+ def.encode(els[i], out, i * def.size);
16332
+ return out;
16333
+ },
16334
+ decode: ((p, count) => {
16335
+ if (count !== void 0 && (!Number.isInteger(count) || count < 0))
16336
+ throw new Error(`ffi-struct: structArray.decode(p, count) requires a non-negative integer count, got ${count}`);
16337
+ if (typeof p === "number") {
16338
+ if (count === void 0)
16339
+ throw new Error(`ffi-struct: structArray.decode(address, count) requires an explicit count (a bare address carries no length)`);
16340
+ if (count === 0)
16341
+ return [];
16342
+ return readN(new DataView(ffi2.readBytes(p, count * size)), count);
16343
+ }
16344
+ let n;
16345
+ if (count !== void 0) {
16346
+ n = count;
16347
+ if (n * size > p.byteLength)
16348
+ throw new Error(`ffi-struct: structArray.decode: count ${n} \xD7 size ${size} = ${n * size} exceeds buffer byteLength ${p.byteLength}`);
16349
+ } else {
16350
+ if (p.byteLength % size !== 0)
16351
+ throw new Error(`ffi-struct: structArray.decode: byteLength ${p.byteLength} is not a multiple of size ${size} (mixed buffer? pass count explicitly)`);
16352
+ n = p.byteLength / size;
16353
+ }
16354
+ if (n === 0)
16355
+ return [];
16356
+ return readN(new DataView(p), n);
16357
+ })
16358
+ };
16359
+ }
16360
+ function struct(a, b6, c) {
16361
+ const isNamed = typeof a === "string";
16362
+ const raw = isNamed ? b6 : a;
16363
+ const opts = isNamed ? c : b6;
16364
+ return createStruct(buildDecl("struct", raw, opts?.pack));
16365
+ }
16366
+
16367
+ // _build/lib/windows/structs.js
16368
+ var RECT = /* @__PURE__ */ struct("RECT", {
16369
+ left: "i32",
16370
+ top: "i32",
16371
+ right: "i32",
16372
+ bottom: "i32"
16373
+ });
16374
+ var POINT = /* @__PURE__ */ struct("POINT", {
16375
+ x: "i32",
16376
+ y: "i32"
16377
+ });
16378
+ var SIZE = /* @__PURE__ */ struct("SIZE", {
16379
+ cx: "i32",
16380
+ cy: "i32"
16381
+ });
16382
+ var LOGFONTW = /* @__PURE__ */ struct("LOGFONTW", {
16383
+ lfHeight: "i32",
16384
+ lfWidth: "i32",
16385
+ lfEscapement: "i32",
16386
+ lfOrientation: "i32",
16387
+ lfWeight: "i32",
16388
+ lfItalic: "u8",
16389
+ lfUnderline: "u8",
16390
+ lfStrikeOut: "u8",
16391
+ lfCharSet: "u8",
16392
+ lfOutPrecision: "u8",
16393
+ lfClipPrecision: "u8",
16394
+ lfQuality: "u8",
16395
+ lfPitchAndFamily: "u8",
16396
+ lfFaceName: "u16[32]@utf-16le"
16397
+ });
16398
+ var OPENFILENAMEW = /* @__PURE__ */ struct("OPENFILENAMEW", {
16399
+ lStructSize: "u32",
16400
+ hwndOwner: "<HWND>ptr",
16401
+ hInstance: "<HMODULE>ptr",
16402
+ lpstrFilter: "<>ptr",
16403
+ lpstrCustomFilter: "<>ptr",
16404
+ nMaxCustFilter: "u32",
16405
+ nFilterIndex: "u32",
16406
+ lpstrFile: "<>ptr",
16407
+ nMaxFile: "u32",
16408
+ lpstrFileTitle: "<>ptr",
16409
+ nMaxFileTitle: "u32",
16410
+ lpstrInitialDir: "<>ptr",
16411
+ lpstrTitle: "<>ptr",
16412
+ Flags: "u32",
16413
+ nFileOffset: "u16",
16414
+ nFileExtension: "u16",
16415
+ lpstrDefExt: "<>ptr",
16416
+ lCustData: "<>ptr",
16417
+ lpfnHook: "<>ptr",
16418
+ lpTemplateName: "<>ptr",
16419
+ pvReserved: "<>ptr",
16420
+ dwReserved: "u32",
16421
+ FlagsEx: "u32"
16422
+ });
16423
+ var BROWSEINFOW = /* @__PURE__ */ struct("BROWSEINFOW", {
16424
+ hwndOwner: "<HWND>ptr",
16425
+ pidlRoot: "<>ptr",
16426
+ pszDisplayName: "<>ptr",
16427
+ lpszTitle: "<>ptr",
16428
+ ulFlags: "u32",
16429
+ lpfn: "<>ptr",
16430
+ lParam: "<>ptr",
16431
+ iImage: "i32"
16432
+ });
16433
+ var NMHDR = /* @__PURE__ */ struct("NMHDR", {
16434
+ hwndFrom: "<HWND>ptr",
16435
+ idFrom: "<>ptr",
16436
+ code: "i32"
16437
+ });
16438
+ var SYSTEMTIME = /* @__PURE__ */ struct("SYSTEMTIME", {
16439
+ wYear: "u16",
16440
+ wMonth: "u16",
16441
+ wDayOfWeek: "u16",
16442
+ wDay: "u16",
16443
+ wHour: "u16",
16444
+ wMinute: "u16",
16445
+ wSecond: "u16",
16446
+ wMilliseconds: "u16"
16447
+ });
16448
+ var NMDATETIMECHANGE = /* @__PURE__ */ struct("NMDATETIMECHANGE", {
16449
+ hdr: NMHDR.__struct,
16450
+ dwFlags: "u32",
16451
+ st: SYSTEMTIME.__struct
16452
+ });
16453
+ var LITEM = /* @__PURE__ */ struct("LITEM", {
16454
+ mask: "u32",
16455
+ iLink: "i32",
16456
+ state: "u32",
16457
+ stateMask: "u32",
16458
+ szID: "u16[48]@utf-16le",
16459
+ szUrl: "u16[2084]@utf-16le"
16460
+ });
16461
+ var NMLINK = /* @__PURE__ */ struct("NMLINK", {
16462
+ hdr: NMHDR.__struct,
16463
+ item: LITEM.__struct
16464
+ });
16465
+ var NMCUSTOMDRAW = /* @__PURE__ */ struct("NMCUSTOMDRAW", {
16466
+ hdr: NMHDR.__struct,
16467
+ dwDrawStage: "u32",
16468
+ hdc: "<HDC>ptr",
16469
+ rc: "i32[4]",
16470
+ dwItemSpec: "<>ptr",
16471
+ uItemState: "u32",
16472
+ lItemlParam: "<>ptr"
16473
+ });
16474
+ var NMLVCUSTOMDRAW = /* @__PURE__ */ struct("NMLVCUSTOMDRAW", {
16475
+ hdr: NMHDR.__struct,
16476
+ dwDrawStage: "u32",
16477
+ hdc: "<HDC>ptr",
16478
+ rc: "i32[4]",
16479
+ dwItemSpec: "<>ptr",
16480
+ uItemState: "u32",
16481
+ lItemlParam: "<>ptr",
16482
+ clrText: "u32",
16483
+ clrTextBk: "u32",
16484
+ iSubItem: "i32",
16485
+ dwItemType: "u32"
16486
+ });
16487
+ var NMLISTVIEW = /* @__PURE__ */ struct("NMLISTVIEW", {
16488
+ hdr: NMHDR.__struct,
16489
+ iItem: "i32",
16490
+ iSubItem: "i32",
16491
+ uNewState: "u32",
16492
+ uOldState: "u32",
16493
+ uChanged: "u32",
16494
+ ptAction: "i32[2]",
16495
+ lParam: "<>ptr"
16496
+ });
16497
+ var TCITEMW = /* @__PURE__ */ struct("TCITEMW", {
16498
+ mask: "u32",
16499
+ dwState: "u32",
16500
+ dwStateMask: "u32",
16501
+ pszText: "<>ptr",
16502
+ cchTextMax: "i32",
16503
+ iImage: "i32",
16504
+ lParam: "<>ptr"
16505
+ });
16506
+ var TVITEM = /* @__PURE__ */ struct("TVITEM", {
16507
+ mask: "u32",
16508
+ hItem: "<>ptr",
16509
+ state: "u32",
16510
+ stateMask: "u32",
16511
+ pszText: "<>ptr",
16512
+ cchTextMax: "i32",
16513
+ iImage: "i32",
16514
+ iSelectedImage: "i32",
16515
+ cChildren: "i32",
16516
+ lParam: "<>ptr"
16517
+ });
16518
+ var TVINSERTSTRUCT = /* @__PURE__ */ struct("TVINSERTSTRUCT", {
16519
+ hParent: "<>ptr",
16520
+ hInsertAfter: "<>ptr",
16521
+ item: TVITEM.__struct
16522
+ });
16523
+ var LVHITTESTINFO = /* @__PURE__ */ struct("LVHITTESTINFO", {
16524
+ pt: "i32[2]",
16525
+ flags: "u32",
16526
+ iItem: "i32",
16527
+ iSubItem: "i32",
16528
+ iGroup: "i32"
16529
+ });
16530
+ var LVITEMW = /* @__PURE__ */ struct("LVITEMW", {
16531
+ mask: "u32",
16532
+ iItem: "i32",
16533
+ iSubItem: "i32",
16534
+ state: "u32",
16535
+ stateMask: "u32",
16536
+ pszText: "<>ptr",
16537
+ cchTextMax: "i32",
16538
+ iImage: "i32",
16539
+ lParam: "<>ptr",
16540
+ iIndent: "i32",
16541
+ iGroupId: "i32",
16542
+ cColumns: "u32",
16543
+ puColumns: "<>ptr",
16544
+ piColFmt: "<>ptr",
16545
+ iGroup: "i32"
16546
+ });
16547
+ var LVCOLUMNW = /* @__PURE__ */ struct("LVCOLUMNW", {
16548
+ mask: "u32",
16549
+ fmt: "i32",
16550
+ cx: "i32",
16551
+ pszText: "<>ptr",
16552
+ cchTextMax: "i32",
16553
+ iSubItem: "i32",
16554
+ iImage: "i32",
16555
+ iOrder: "i32",
16556
+ cxMin: "i32",
16557
+ cxDefault: "i32",
16558
+ cxIdeal: "i32"
16559
+ });
16560
+ var MSG = /* @__PURE__ */ struct("MSG", {
16561
+ hwnd: "<HWND>ptr",
16562
+ message: "u32",
16563
+ wParam: "<>ptr",
16564
+ lParam: "<>ptr",
16565
+ time: "u32",
16566
+ pt: POINT.__struct
16567
+ });
16568
+ var PAINTSTRUCT = /* @__PURE__ */ struct("PAINTSTRUCT", {
16569
+ hdc: "<HDC>ptr",
16570
+ fErase: "i32",
16571
+ rcPaint: RECT.__struct,
16572
+ fRestore: "i32",
16573
+ fIncUpdate: "i32",
16574
+ rgbReserved: "u8[32]"
16575
+ });
16576
+
16577
+ // _build/lib/windows/user32.js
16578
+ var b = (name, sig, encoders) => bind("user32.dll", name, sig, encoders);
16579
+ var _bProbe = b("GetDesktopWindow", " -> <HWND>ptr");
16580
+ var LONG_PTR_SYM = os3.arch === "x64" ? "PtrW" : "W";
16581
+ var SetWindowPos = /* @__PURE__ */ b("SetWindowPos", "<HWND>ptr <>ptr@SetWindowPosHwnd i32 i32 i32 i32 u32 -> i32");
16582
+ var SetWindowText = /* @__PURE__ */ b("SetWindowTextW", "<HWND>ptr <WCHAR>ptr -> i32");
16583
+ var GetWindowLongPtr = /* @__PURE__ */ b("GetWindowLong" + LONG_PTR_SYM, "<HWND>ptr i32@Gwlp -> <>ptr");
16584
+ var SetWindowLongPtr = /* @__PURE__ */ b("SetWindowLong" + LONG_PTR_SYM, "<HWND>ptr i32@Gwlp <>ptr -> <>ptr");
16585
+ var EnableWindow = /* @__PURE__ */ b("EnableWindow", "<HWND>ptr i32 -> i32");
16586
+ var SetParent = /* @__PURE__ */ b("SetParent", "<HWND>ptr <HWND>ptr -> <HWND>ptr");
16587
+ var DefWindowProc = /* @__PURE__ */ b("DefWindowProcW", "<HWND>ptr u32@AnyMsg <>ptr <>ptr -> <>ptr");
16588
+ var CallWindowProc = /* @__PURE__ */ b("CallWindowProcW", "<>ptr <HWND>ptr u32@AnyMsg <>ptr <>ptr -> <>ptr");
16589
+ var GetDC = /* @__PURE__ */ b("GetDC", "<HWND>ptr -> <HDC>ptr");
16590
+ var ReleaseDC = /* @__PURE__ */ b("ReleaseDC", "<HWND>ptr <HDC>ptr! -> i32");
16591
+ var DrawText = /* @__PURE__ */ b("DrawTextW", "<HDC>ptr! <WCHAR>ptr i32 <RECT>ptr i32 -> i32");
16592
+ var InvalidateRect = /* @__PURE__ */ b("InvalidateRect", "<HWND>ptr <RECT>ptr i32 -> i32", { RECT });
16593
+ var SetCursor = /* @__PURE__ */ b("SetCursor", "<HCURSOR>ptr -> <HCURSOR>ptr");
16594
+ var LoadCursor = /* @__PURE__ */ b("LoadCursorW", "<HMODULE>ptr <>ptr -> <HCURSOR>ptr");
16595
+ var GetCursorPos = /* @__PURE__ */ b("GetCursorPos", "<POINT>ptr -> i32");
16596
+ var ScreenToClient = /* @__PURE__ */ b("ScreenToClient", "<HWND>ptr <POINT>ptr -> i32");
16597
+ var ShowScrollBar = /* @__PURE__ */ b("ShowScrollBar", "<HWND>ptr u32 i32 -> i32");
16598
+ var GetSystemMetrics = /* @__PURE__ */ b("GetSystemMetrics", "i32 -> i32");
16599
+
16600
+ // _build/lib/react-qw/reconciler.js
16601
+ var import_react_reconciler = __toESM(require_react_reconciler(), 1);
16602
+ var import_react = __toESM(require_react(), 1);
16603
+ var import_constants = __toESM(require_constants(), 1);
16604
+ import * as gui3 from "gui";
16605
+ import * as os4 from "os";
16606
+
16607
+ // _build/lib/windows/gdi32.js
16608
+ var b2 = (name, sig, encoders) => bind("gdi32.dll", name, sig, encoders);
16609
+ var POINTArr = structArray(POINT);
16610
+ var DeleteObject = /* @__PURE__ */ b2("DeleteObject", "<HGDIOBJ>ptr -> i32");
16611
+ var GetDeviceCaps = /* @__PURE__ */ b2("GetDeviceCaps", "<HDC>ptr! i32@DeviceCap -> i32");
16612
+ var CreateFontIndirect = /* @__PURE__ */ b2("CreateFontIndirectW", "<LOGFONTW>ptr -> <HGDIOBJ>ptr", { LOGFONTW });
16613
+ var SelectObject = /* @__PURE__ */ b2("SelectObject", "<HDC>ptr! <HGDIOBJ>ptr -> <HGDIOBJ>ptr");
16614
+ var GetObject = /* @__PURE__ */ b2("GetObjectW", "<HGDIOBJ>ptr i32 <BYTE>ptr -> i32");
16615
+
16616
+ // _build/lib/react-qw/props.js
16617
+ import * as gui from "gui";
16618
+ function applyProps(instance, newProps, _oldProps) {
16619
+ const hwnd = instance.hwnd;
16620
+ instance.props = newProps;
16621
+ if (hwnd === null)
16622
+ return;
16623
+ const textVal = "text" in newProps ? newProps.text : typeof newProps.children === "string" ? newProps.children : typeof newProps.children === "number" ? String(newProps.children) : void 0;
16624
+ if (textVal !== void 0) {
16625
+ let cursor = -1;
16626
+ if (instance.type === "EDIT") {
16627
+ const sel = gui.SendMessage(hwnd, 176, 0, 0);
16628
+ cursor = sel >>> 16;
16629
+ }
16630
+ SetWindowText(hwnd, textVal);
16631
+ if (instance.type === "EDIT" && cursor >= 0) {
16632
+ gui.SendMessage(hwnd, 177, cursor, cursor);
16633
+ }
16634
+ }
16635
+ if ("disabled" in newProps) {
16636
+ EnableWindow(hwnd, !newProps.disabled ? 1 : 0);
16637
+ }
16638
+ if ("hidden" in newProps) {
16639
+ gui.ShowWindow(
16640
+ hwnd,
16641
+ newProps.hidden ? 0 : 5
16642
+ /* gui.ShowWindowCmd.SHOW */
16643
+ );
16644
+ }
16645
+ if ("visible" in newProps) {
16646
+ gui.ShowWindow(
16647
+ hwnd,
16648
+ newProps.visible ? 5 : 0
16649
+ /* gui.ShowWindowCmd.HIDE */
16650
+ );
16651
+ }
16652
+ }
16653
+
16654
+ // _build/lib/react-qw/layout.js
16655
+ var DEFAULT_W = 100;
16656
+ var DEFAULT_H = 30;
16657
+ function calculateFlexLayout(flex, parentW, parentH, children) {
16658
+ const dir = flex.flexDirection || "column";
16659
+ const gap = flex.gap ?? 0;
16660
+ const justify = flex.justifyContent || "flex-start";
16661
+ const align = flex.alignItems || "stretch";
16662
+ const isRow = dir === "row";
16663
+ const n = children.length;
16664
+ const mainSize = isRow ? "w" : "h";
16665
+ const crossSize = isRow ? "h" : "w";
16666
+ const mainPos = isRow ? "x" : "y";
16667
+ const crossPos = isRow ? "y" : "x";
16668
+ const mainDim = isRow ? "width" : "height";
16669
+ const crossDim = isRow ? "height" : "width";
16670
+ const pt = flex.paddingTop ?? flex.padding ?? 0;
16671
+ const pr = flex.paddingRight ?? flex.padding ?? 0;
16672
+ const pb = flex.paddingBottom ?? flex.padding ?? 0;
16673
+ const pl = flex.paddingLeft ?? flex.padding ?? 0;
16674
+ const mainPadding = isRow ? pl + pr : pt + pb;
16675
+ const crossPadding = isRow ? pt + pb : pl + pr;
16676
+ const parentMain = (isRow ? parentW : parentH) - mainPadding;
16677
+ const parentCross = (isRow ? parentH : parentW) - crossPadding;
16678
+ const sizes = children.map((c) => ({
16679
+ w: typeof c.style.width === "number" ? c.style.width : DEFAULT_W,
16680
+ h: typeof c.style.height === "number" ? c.style.height : DEFAULT_H
16681
+ }));
16682
+ const flexGrows = children.map((c) => c.style.flexGrow ?? 0);
16683
+ const totalGrow = flexGrows.reduce((s, g) => s + g, 0);
16684
+ const baseMain = sizes.reduce((s, c) => s + c[mainSize], 0);
16685
+ let freeGrow = parentMain - baseMain - Math.max(0, n - 1) * gap;
16686
+ if (totalGrow > 0 && freeGrow > 0) {
16687
+ for (let i = 0; i < n; i++) {
16688
+ sizes[i][mainSize] += freeGrow * flexGrows[i] / totalGrow;
16689
+ }
16690
+ }
16691
+ const totalMain = sizes.reduce((s, c) => s + c[mainSize], 0);
16692
+ const free = parentMain - totalMain - Math.max(0, n - 1) * gap;
16693
+ let offset = 0, extraGap = 0;
16694
+ if (justify === "flex-end")
16695
+ offset = free;
16696
+ else if (justify === "center")
16697
+ offset = Math.max(0, free / 2);
16698
+ else if (justify === "space-between" && n > 1)
16699
+ extraGap = free / (n - 1);
16700
+ else if (justify === "space-around") {
16701
+ extraGap = free / n;
16702
+ offset = extraGap / 2;
16703
+ } else if (justify === "space-evenly") {
16704
+ extraGap = free / (n + 1);
16705
+ offset = extraGap;
16706
+ }
16707
+ let cursor = offset;
16708
+ return sizes.map((sz, i) => {
16709
+ const childCrossBase = sz[crossSize];
16710
+ const childAlign = children[i].style.alignSelf ?? "auto";
16711
+ const effectiveAlign = childAlign === "auto" ? align : childAlign;
16712
+ let childMain = sz[mainSize];
16713
+ let childCross = childCrossBase;
16714
+ const res = { x: 0, y: 0, width: 0, height: 0 };
16715
+ res[mainPos] = cursor;
16716
+ res[crossPos] = 0;
16717
+ res[mainDim] = childMain;
16718
+ res[crossDim] = childCross;
16719
+ if (effectiveAlign === "stretch") {
16720
+ const hasExplicitCross = typeof children[i].style[crossDim] === "number";
16721
+ if (!hasExplicitCross) {
16722
+ res[crossDim] = parentCross;
16723
+ res[crossPos] = 0;
16724
+ }
16725
+ } else if (effectiveAlign === "flex-end") {
16726
+ res[crossPos] = parentCross - childCross;
16727
+ } else if (effectiveAlign === "center") {
16728
+ res[crossPos] = Math.max(0, (parentCross - childCross) / 2);
16729
+ }
16730
+ cursor += childMain + gap + extraGap;
16731
+ return res;
16732
+ });
15813
16733
  }
15814
16734
 
15815
16735
  // _build/lib/text-measure.js
15816
- var user32 = bindLib("user32.dll", {
15817
- DrawTextW: "ptr wstr i32 ptr i32 -> i32",
15818
- GetDC: "ptr -> ptr",
15819
- ReleaseDC: "ptr ptr -> i32"
15820
- });
15821
- var gdi32 = bindLib("gdi32.dll", {
15822
- SelectObject: "ptr ptr -> ptr"
15823
- });
16736
+ import * as gui2 from "gui";
15824
16737
  function measureText(hdc, text, maxWidth) {
15825
- const rect = new ArrayBuffer(16);
15826
- const dv = new DataView(rect);
15827
- dv.setInt32(8, maxWidth, true);
15828
- user32.DrawTextW(
16738
+ const r = RECT.encode({ right: maxWidth });
16739
+ DrawText(
15829
16740
  hdc,
15830
16741
  text,
15831
16742
  -1,
15832
- rect,
16743
+ r.ptr,
15833
16744
  1024
15834
16745
  /* gui.DrawTextFlag.CALCRECT */
15835
16746
  );
15836
- return { width: dv.getInt32(8, true), height: dv.getInt32(12, true) };
16747
+ const { right, bottom } = RECT.decode(r);
16748
+ return { width: right, height: bottom };
15837
16749
  }
15838
16750
  function getButtonIdealSize(hwnd) {
15839
- const size = new ArrayBuffer(8);
15840
- gui2.SendMessage(hwnd, 5633, 0, ffi2.bufferPtr(size));
15841
- const dv = new DataView(size);
15842
- return { width: dv.getInt32(0, true), height: dv.getInt32(4, true) };
16751
+ const size = SIZE.alloc();
16752
+ gui2.SendMessage(hwnd, 5633, 0, size.ptr);
16753
+ const { cx, cy } = SIZE.decode(size);
16754
+ return { width: cx, height: cy };
15843
16755
  }
15844
16756
  function measureTextForHwnd(hwnd, text) {
15845
- const hdc = user32.GetDC(hwnd);
16757
+ const hdc = GetDC(hwnd);
15846
16758
  if (!hdc)
15847
16759
  return { width: 0, height: 0 };
15848
16760
  const hFont = gui2.SendMessage(hwnd, 49, 0, 0);
15849
- const oldFont = hFont ? gdi32.SelectObject(hdc, hFont) : 0;
16761
+ const oldFont = hFont ? SelectObject(hdc, hFont) : NULL;
15850
16762
  const result = measureText(hdc, text, 0);
15851
16763
  if (hFont)
15852
- gdi32.SelectObject(hdc, oldFont);
15853
- user32.ReleaseDC(hwnd, hdc);
16764
+ SelectObject(hdc, oldFont);
16765
+ ReleaseDC(hwnd, hdc);
15854
16766
  const wr = gui2.GetWindowRect(hwnd);
15855
16767
  const cr = gui2.GetClientRect(hwnd);
15856
16768
  if (wr && cr) {
@@ -15862,14 +16774,20 @@ function measureTextForHwnd(hwnd, text) {
15862
16774
 
15863
16775
  // _build/lib/react-qw/reconciler.js
15864
16776
  var dpiFont = gui3.CreateSystemDpiFont();
15865
- var scaleFactor = gui3.GetScaleFactor();
16777
+ var scaleFactor = (() => {
16778
+ const hdc = GetDC(NULL);
16779
+ const dpi = hdc ? GetDeviceCaps(hdc, 88) : 96;
16780
+ if (hdc)
16781
+ ReleaseDC(NULL, hdc);
16782
+ return dpi / 96;
16783
+ })();
15866
16784
  var DELAYED_CONTROLS = /* @__PURE__ */ new Set(["SysListView32", "SysTreeView32", "LISTBOX", "COMBOBOX", "msctls_trackbar32", "SysDateTimePick32", "SysLink"]);
15867
16785
  function isDelayedControl(winClass) {
15868
16786
  return DELAYED_CONTROLS.has(winClass);
15869
16787
  }
15870
16788
  function setupWindowProc(instance, hwnd) {
15871
16789
  instance.hwnd = hwnd;
15872
- const oldProc = gui3.GetWindowLongPtr(
16790
+ const oldProc = GetWindowLongPtr(
15873
16791
  hwnd,
15874
16792
  -4
15875
16793
  /* gui.Gwlp.WNDPROC */
@@ -15878,11 +16796,11 @@ function setupWindowProc(instance, hwnd) {
15878
16796
  gui3.SetWindowProc(hwnd, (hwnd2, msg, wParam, lParam) => {
15879
16797
  const ev = instance.props.onEvent;
15880
16798
  if (!ev)
15881
- return gui3.CallWindowProc(oldProc, hwnd2, msg, wParam, lParam);
16799
+ return CallWindowProc(oldProc, hwnd2, msg, wParam, lParam);
15882
16800
  if (typeof ev === "object") {
15883
- return ev.fn({ hwnd: hwnd2, msg, wParam, lParam, callOldWndProc: () => gui3.CallWindowProc(oldProc, hwnd2, msg, wParam, lParam) });
16801
+ return ev.fn({ hwnd: hwnd2, msg, wParam, lParam, callOldWndProc: () => CallWindowProc(oldProc, hwnd2, msg, wParam, lParam) });
15884
16802
  }
15885
- const result = gui3.CallWindowProc(oldProc, hwnd2, msg, wParam, lParam);
16803
+ const result = CallWindowProc(oldProc, hwnd2, msg, wParam, lParam);
15886
16804
  const override = ev({ hwnd: hwnd2, msg, wParam, lParam });
15887
16805
  return typeof override === "number" && Number.isInteger(override) ? override : result;
15888
16806
  });
@@ -15952,7 +16870,7 @@ function runFlexLayout(inst) {
15952
16870
  if (lr && lr.x === r.x && lr.y === r.y && lr.w === r.width && lr.h === r.height)
15953
16871
  continue;
15954
16872
  console.log("flex: set", child.type, child.hwnd, "to", r.x, r.y, r.width, r.height);
15955
- gui3.SetWindowPos(
16873
+ SetWindowPos(
15956
16874
  child.hwnd,
15957
16875
  0,
15958
16876
  (r.x + pl) * scaleFactor,
@@ -15962,7 +16880,7 @@ function runFlexLayout(inst) {
15962
16880
  64
15963
16881
  /* gui.SetWindowPosFlag.SWP_SHOWWINDOW */
15964
16882
  );
15965
- gui3.InvalidateRect(child.hwnd, null, true);
16883
+ InvalidateRect(child.hwnd, NULL, 1);
15966
16884
  child.lastRect = { x: r.x, y: r.y, w: r.width, h: r.height };
15967
16885
  }
15968
16886
  for (const c of children)
@@ -16008,7 +16926,7 @@ var hostConfig = {
16008
16926
  if (child.hwnd === null) {
16009
16927
  ensureChildWindow(child, parent.hwnd);
16010
16928
  } else {
16011
- gui3.SetParent(child.hwnd, parent.hwnd);
16929
+ SetParent(child.hwnd, parent.hwnd ?? NULL);
16012
16930
  }
16013
16931
  if (false)
16014
16932
  console.log("[reconciler] appendInitialChild parent:", parent.hwnd, "child:", child.hwnd);
@@ -16018,7 +16936,7 @@ var hostConfig = {
16018
16936
  if (child.hwnd === null) {
16019
16937
  ensureChildWindow(child, parent.hwnd);
16020
16938
  } else {
16021
- gui3.SetParent(child.hwnd, parent.hwnd);
16939
+ SetParent(child.hwnd, parent.hwnd ?? NULL);
16022
16940
  }
16023
16941
  if (false)
16024
16942
  console.log("[reconciler] appendChild parent:", parent.hwnd, "child:", child.hwnd);
@@ -16028,7 +16946,7 @@ var hostConfig = {
16028
16946
  if (child.hwnd === null) {
16029
16947
  ensureChildWindow(child, container);
16030
16948
  } else {
16031
- gui3.SetParent(child.hwnd, container);
16949
+ SetParent(child.hwnd, container);
16032
16950
  }
16033
16951
  const rootInst = instancesByHwnd.get(container);
16034
16952
  if (rootInst)
@@ -16040,7 +16958,7 @@ var hostConfig = {
16040
16958
  if (child.hwnd === null) {
16041
16959
  ensureChildWindow(child, parent.hwnd);
16042
16960
  } else {
16043
- gui3.SetParent(child.hwnd, parent.hwnd);
16961
+ SetParent(child.hwnd, parent.hwnd ?? NULL);
16044
16962
  }
16045
16963
  if (false)
16046
16964
  console.log("[reconciler] insertBefore parent:", parent.hwnd, "child:", child.hwnd, "before:", beforeChild.hwnd);
@@ -16052,7 +16970,7 @@ var hostConfig = {
16052
16970
  if (child.hwnd === null) {
16053
16971
  ensureChildWindow(child, container);
16054
16972
  } else {
16055
- gui3.SetParent(child.hwnd, container);
16973
+ SetParent(child.hwnd, container);
16056
16974
  }
16057
16975
  const rootInst = instancesByHwnd.get(container);
16058
16976
  if (!rootInst)
@@ -16109,7 +17027,7 @@ var hostConfig = {
16109
17027
  resetTextContent(_instance) {
16110
17028
  },
16111
17029
  commitTextUpdate(instance, _oldText, newText) {
16112
- gui3.SetWindowText(instance.hwnd, newText);
17030
+ SetWindowText(instance.hwnd, newText);
16113
17031
  },
16114
17032
  hideInstance(instance) {
16115
17033
  if (instance.hwnd !== null)
@@ -16163,10 +17081,10 @@ var hostConfig = {
16163
17081
  clearContainer(_container) {
16164
17082
  },
16165
17083
  scheduleTimeout(fn, delay) {
16166
- return os.setTimeout(fn, delay);
17084
+ return os4.setTimeout(fn, delay);
16167
17085
  },
16168
17086
  cancelTimeout(id) {
16169
- os.clearTimeout?.(id);
17087
+ os4.clearTimeout?.(id);
16170
17088
  },
16171
17089
  noTimeout: -1,
16172
17090
  supportsMutation: true,
@@ -16333,298 +17251,23 @@ var ComboBox = (0, import_react4.forwardRef)(({ items, selectedIndex: controlled
16333
17251
  var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1);
16334
17252
  var import_react5 = __toESM(require_react(), 1);
16335
17253
  import * as gui6 from "gui";
16336
- import * as ffi4 from "ffi";
16337
-
16338
- // _build/lib/ffi-struct.js
16339
- import * as os2 from "os";
16340
- var PTR = os2.arch === "x64" ? 8 : 4;
16341
- var AS = {
16342
- u8: [1, 1],
16343
- i8: [1, 1],
16344
- u16: [2, 2],
16345
- i16: [2, 2],
16346
- u32: [4, 4],
16347
- i32: [4, 4],
16348
- u64: [8, 8],
16349
- i64: [8, 8],
16350
- f32: [4, 4],
16351
- f64: [8, 8],
16352
- ptr: [PTR, PTR],
16353
- wstr: [2, 2]
16354
- // 仅定长数组元素用(wchar)
16355
- };
16356
- function alignUp(v, a) {
16357
- return v + a - 1 & ~(a - 1);
16358
- }
16359
- function parseField(f) {
16360
- const arr = /^(.+)\[(\d+)\]$/.exec(f);
16361
- if (arr) {
16362
- const b2 = normKind(arr[1]);
16363
- if (b2 === "void")
16364
- throw new Error(`ffi-struct: "void" cannot be an array base`);
16365
- return { base: b2, count: Number(arr[2]) };
16366
- }
16367
- const b = normKind(f);
16368
- if (b === "void" || b === "wstr")
16369
- throw new Error(`ffi-struct: invalid scalar field type "${f}"`);
16370
- return { base: b, count: 1 };
16371
- }
16372
- function layout(def) {
16373
- const fields = [];
16374
- let cursor = 0;
16375
- let maxAlign = 1;
16376
- for (const key of Object.keys(def)) {
16377
- const v = def[key];
16378
- let a;
16379
- let w;
16380
- if (typeof v === "string") {
16381
- const { base, count } = parseField(v);
16382
- const [align, elem] = AS[base];
16383
- a = align;
16384
- w = count >= 1 ? elem * count : elem;
16385
- fields.push({ name: key, base, count, offset: 0 });
16386
- } else {
16387
- const child = v;
16388
- a = child.structAlign;
16389
- w = child.size;
16390
- fields.push({ name: key, base: "u8", count: 0, offset: 0, child });
16391
- }
16392
- const off = alignUp(cursor, a);
16393
- const f = fields[fields.length - 1];
16394
- f.offset = off;
16395
- cursor = off + w;
16396
- if (a > maxAlign)
16397
- maxAlign = a;
16398
- }
16399
- return { fields, size: alignUp(cursor, maxAlign), structAlign: maxAlign };
16400
- }
16401
- var _layoutCache = /* @__PURE__ */ new WeakMap();
16402
- function buildLayout(def) {
16403
- let hit = _layoutCache.get(def);
16404
- if (hit)
16405
- return hit;
16406
- hit = layout(def);
16407
- _layoutCache.set(def, hit);
16408
- return hit;
16409
- }
16410
- function readScalar(dv, off, k) {
16411
- switch (k) {
16412
- case "u8":
16413
- return dv.getUint8(off);
16414
- case "i8":
16415
- return dv.getInt8(off);
16416
- case "u16":
16417
- return dv.getUint16(off, true);
16418
- case "i16":
16419
- return dv.getInt16(off, true);
16420
- case "u32":
16421
- return dv.getUint32(off, true);
16422
- case "i32":
16423
- return dv.getInt32(off, true);
16424
- case "u64":
16425
- return Number(dv.getBigUint64(off, true));
16426
- case "i64":
16427
- return Number(dv.getBigInt64(off, true));
16428
- case "f32":
16429
- return dv.getFloat32(off, true);
16430
- case "f64":
16431
- return dv.getFloat64(off, true);
16432
- case "ptr":
16433
- return readPtr(dv, off);
16434
- case "wstr":
16435
- return dv.getUint16(off, true);
16436
- }
16437
- }
16438
- function readPtr(dv, off) {
16439
- if (PTR === 8)
16440
- return Number(dv.getBigUint64(off, true));
16441
- return dv.getUint32(off, true);
16442
- }
16443
- function writeScalar(dv, off, k, val) {
16444
- switch (k) {
16445
- case "u8":
16446
- dv.setUint8(off, val);
16447
- break;
16448
- case "i8":
16449
- dv.setInt8(off, val);
16450
- break;
16451
- case "u16":
16452
- dv.setUint16(off, val, true);
16453
- break;
16454
- case "i16":
16455
- dv.setInt16(off, val, true);
16456
- break;
16457
- case "u32":
16458
- dv.setUint32(off, val >>> 0, true);
16459
- break;
16460
- case "i32":
16461
- dv.setInt32(off, val | 0, true);
16462
- break;
16463
- case "u64":
16464
- dv.setBigUint64(off, BigInt(Math.trunc(val)), true);
16465
- break;
16466
- case "i64":
16467
- dv.setBigInt64(off, BigInt(Math.trunc(val)), true);
16468
- break;
16469
- case "f32":
16470
- dv.setFloat32(off, val, true);
16471
- break;
16472
- case "f64":
16473
- dv.setFloat64(off, val, true);
16474
- break;
16475
- case "ptr":
16476
- writePtr(dv, off, val);
16477
- break;
16478
- case "wstr":
16479
- dv.setUint16(off, val, true);
16480
- break;
16481
- }
16482
- }
16483
- function writePtr(dv, off, val) {
16484
- if (PTR === 8)
16485
- dv.setBigUint64(off, BigInt(Math.trunc(val)), true);
16486
- else
16487
- dv.setUint32(off, val >>> 0, true);
16488
- }
16489
- function readField(dv, base, f) {
16490
- const off = base + f.offset;
16491
- if (f.child)
16492
- return readInto(f.child, dv.buffer, off);
16493
- if (f.count > 1) {
16494
- if (f.base === "wstr") {
16495
- const arr = new Uint16Array(dv.buffer, dv.byteOffset + off, f.count);
16496
- let end = 0;
16497
- while (end < arr.length && arr[end] !== 0)
16498
- end++;
16499
- let s = "";
16500
- for (let i = 0; i < end; i++)
16501
- s += String.fromCharCode(arr[i]);
16502
- return s;
16503
- }
16504
- const out = [];
16505
- const step = AS[f.base][1];
16506
- for (let i = 0; i < f.count; i++)
16507
- out.push(readScalar(dv, off + i * step, f.base));
16508
- return out;
16509
- }
16510
- return readScalar(dv, off, f.base);
16511
- }
16512
- function writeField(dv, base, f, v) {
16513
- const off = base + f.offset;
16514
- if (f.child) {
16515
- writeInto(f.child, v, dv.buffer, off);
16516
- return;
16517
- }
16518
- if (f.count > 1) {
16519
- if (f.base === "wstr") {
16520
- const s = String(v ?? "");
16521
- const arr = new Uint16Array(dv.buffer, dv.byteOffset + off, f.count);
16522
- for (let i = 0; i < arr.length; i++)
16523
- arr[i] = 0;
16524
- const n = Math.min(s.length, f.count - 1);
16525
- for (let i = 0; i < n; i++)
16526
- arr[i] = s.charCodeAt(i);
16527
- return;
16528
- }
16529
- const step = AS[f.base][1];
16530
- const list = v ?? [];
16531
- for (let i = 0; i < f.count; i++)
16532
- writeScalar(dv, off + i * step, f.base, list[i] ?? 0);
16533
- return;
16534
- }
16535
- writeScalar(dv, off, f.base, Number(v));
16536
- }
16537
- function doSize(def) {
16538
- return buildLayout(def).size;
16539
- }
16540
- function readInto(child, buf, offset) {
16541
- const r = child;
16542
- return r.read(buf, offset);
16543
- }
16544
- function doRead(_def, fields, buf, offset) {
16545
- const out = {};
16546
- const dv = new DataView(buf);
16547
- for (const f of fields)
16548
- out[f.name] = readField(dv, offset, f);
16549
- return out;
16550
- }
16551
- function doWrite(def, fields, v, buf, offset = 0) {
16552
- buf = buf ?? new ArrayBuffer(doSize(def));
16553
- const dv = new DataView(buf);
16554
- for (const f of fields)
16555
- writeField(dv, offset, f, v[f.name]);
16556
- return buf;
16557
- }
16558
- function writeInto(child, v, buf, offset) {
16559
- const w = child;
16560
- w.write(v, buf, offset);
16561
- }
16562
- function struct(def) {
16563
- const { fields, size, structAlign } = buildLayout(def);
16564
- return {
16565
- __fields: def,
16566
- size,
16567
- structAlign,
16568
- read: (buf, offset = 0) => doRead(def, fields, buf, offset),
16569
- write: (v, buf, offset = 0) => doWrite(def, fields, v, buf, offset),
16570
- offsetOf: (name) => {
16571
- for (const f of fields)
16572
- if (f.name === name)
16573
- return f.offset;
16574
- throw new Error(`ffi-struct: no field "${String(name)}"`);
16575
- }
16576
- };
16577
- }
16578
17254
 
16579
17255
  // _build/lib/react-qw/nmhdr.js
16580
- import * as os3 from "os";
16581
- import * as ffi3 from "ffi";
16582
- var IS64 = os3.arch === "x64";
16583
- var PTR_SIZE = IS64 ? 8 : 4;
16584
- var NMHDR = struct({ hwndFrom: "ptr", idFrom: "ptr", code: "i32" });
16585
- var NMHDR_SIZE = NMHDR.size;
16586
- var NMHDR_CODE = NMHDR.offsetOf("code");
16587
- function readI32At(ptr, offset) {
16588
- return ffi3.readByte(ptr + offset) | ffi3.readByte(ptr + offset + 1) << 8 | ffi3.readByte(ptr + offset + 2) << 16 | ffi3.readByte(ptr + offset + 3) << 24;
16589
- }
16590
- function readU16At(ptr, offset) {
16591
- return ffi3.readByte(ptr + offset) | ffi3.readByte(ptr + offset + 1) << 8;
16592
- }
16593
17256
  function nmCode(lParam) {
16594
- return readI32At(lParam, NMHDR_CODE);
17257
+ return NMHDR.decode(lParam).code;
16595
17258
  }
16596
17259
 
16597
17260
  // _build/lib/react-qw/components/DateTimePicker.js
16598
- var SYSTEMTIME = struct({
16599
- wYear: "u16",
16600
- wMonth: "u16",
16601
- wDayOfWeek: "u16",
16602
- wDay: "u16",
16603
- wHour: "u16",
16604
- wMinute: "u16",
16605
- wSecond: "u16",
16606
- wMilliseconds: "u16"
16607
- });
16608
- var NMDATETIMECHANGE = struct({
16609
- hdr: NMHDR,
16610
- dwFlags: "u32",
16611
- st: SYSTEMTIME
16612
- });
16613
- function bufPtr(buf) {
16614
- return ffi4.bufferPtr(buf);
16615
- }
16616
17261
  function dateToSysTimeBuf(d) {
16617
- const buf = new ArrayBuffer(16);
16618
- const dv = new DataView(buf);
16619
- dv.setUint16(0, d.getFullYear(), true);
16620
- dv.setUint16(2, d.getMonth() + 1, true);
16621
- dv.setUint16(4, 0, true);
16622
- dv.setUint16(6, d.getDate(), true);
16623
- dv.setUint16(8, d.getHours(), true);
16624
- dv.setUint16(10, d.getMinutes(), true);
16625
- dv.setUint16(12, d.getSeconds(), true);
16626
- dv.setUint16(14, d.getMilliseconds(), true);
16627
- return buf;
17262
+ return SYSTEMTIME.encode({
17263
+ wYear: d.getFullYear(),
17264
+ wMonth: d.getMonth() + 1,
17265
+ wDay: d.getDate(),
17266
+ wHour: d.getHours(),
17267
+ wMinute: d.getMinutes(),
17268
+ wSecond: d.getSeconds(),
17269
+ wMilliseconds: d.getMilliseconds()
17270
+ });
16628
17271
  }
16629
17272
  var DateTimePicker = (0, import_react5.forwardRef)(function DateTimePicker2({ value, onChange, defaultValue, format = "short", allowNone, updown, style }, ref) {
16630
17273
  const [internalDate, setInternalDate] = (0, import_react5.useState)(defaultValue ?? null);
@@ -16649,7 +17292,7 @@ var DateTimePicker = (0, import_react5.forwardRef)(function DateTimePicker2({ va
16649
17292
  const d = effectiveDate;
16650
17293
  if (d) {
16651
17294
  const buf = dateToSysTimeBuf(d);
16652
- gui6.SendMessage(h, 4098, 0, bufPtr(buf));
17295
+ gui6.SendMessage(h, 4098, 0, buf.ptr);
16653
17296
  } else {
16654
17297
  gui6.SendMessage(h, 4098, 1, 0);
16655
17298
  }
@@ -16658,7 +17301,7 @@ var DateTimePicker = (0, import_react5.forwardRef)(function DateTimePicker2({ va
16658
17301
  const h = dpRef.current;
16659
17302
  if (!h)
16660
17303
  return;
16661
- gui6.InvalidateRect(h, null, true);
17304
+ InvalidateRect(h, NULL, 1);
16662
17305
  const cr = gui6.GetClientRect(h);
16663
17306
  if (cr) {
16664
17307
  const w = cr.right - cr.left;
@@ -16670,20 +17313,13 @@ var DateTimePicker = (0, import_react5.forwardRef)(function DateTimePicker2({ va
16670
17313
  if (e.msg === 78) {
16671
17314
  const code = nmCode(e.lParam);
16672
17315
  if (code === -759) {
16673
- const st = NMDATETIMECHANGE.offsetOf("st");
16674
- const dwFlags = readI32At(e.lParam, NMDATETIMECHANGE.offsetOf("dwFlags"));
17316
+ const { dwFlags, st } = NMDATETIMECHANGE.decode(e.lParam);
16675
17317
  if (dwFlags === 1) {
16676
17318
  if (!isControlled)
16677
17319
  setInternalDate(null);
16678
17320
  onChangeRef.current?.(null);
16679
17321
  } else {
16680
- const year = readU16At(e.lParam, st + 0);
16681
- const month = readU16At(e.lParam, st + 2);
16682
- const day = readU16At(e.lParam, st + 6);
16683
- const hour = readU16At(e.lParam, st + 8);
16684
- const min = readU16At(e.lParam, st + 10);
16685
- const sec = readU16At(e.lParam, st + 12);
16686
- const d = new Date(year, month - 1, day, hour, min, sec);
17322
+ const d = new Date(st.wYear, st.wMonth - 1, st.wDay, st.wHour, st.wMinute, st.wSecond);
16687
17323
  if (!isControlled)
16688
17324
  setInternalDate(d);
16689
17325
  onChangeRef.current?.(d);
@@ -16699,14 +17335,6 @@ var DateTimePicker = (0, import_react5.forwardRef)(function DateTimePicker2({ va
16699
17335
  var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1);
16700
17336
  var import_react6 = __toESM(require_react(), 1);
16701
17337
  import * as gui7 from "gui";
16702
- import * as ffi5 from "ffi";
16703
- function textToUtf16(s) {
16704
- const buf = new ArrayBuffer((s.length + 1) * 2);
16705
- const dv = new DataView(buf);
16706
- for (let i = 0; i < s.length; i++)
16707
- dv.setUint16(i * 2, s.charCodeAt(i), true);
16708
- return buf;
16709
- }
16710
17338
  var Input = (0, import_react6.forwardRef)(({ value: controlledValue, defaultValue = "", onChange, placeholder, password, multiline, readonly, number, disabled, style }, ref) => {
16711
17339
  const [internalValue, setInternalValue] = (0, import_react6.useState)(defaultValue);
16712
17340
  const isControlled = controlledValue !== void 0;
@@ -16725,8 +17353,8 @@ var Input = (0, import_react6.forwardRef)(({ value: controlledValue, defaultValu
16725
17353
  const h = inputRef.current;
16726
17354
  if (!h || !placeholder)
16727
17355
  return;
16728
- const buf = textToUtf16(placeholder);
16729
- gui7.SendMessage(h, 5377, 1, ffi5.bufferPtr(buf));
17356
+ const buf = WCHAR.encode(placeholder);
17357
+ gui7.SendMessage(h, 5377, 1, buf.ptr);
16730
17358
  }, [placeholder]);
16731
17359
  return (0, import_jsx_runtime5.jsx)("w", { type: "EDIT", text: displayValue, ws, style, disabled, ref: (h) => {
16732
17360
  inputRef.current = h;
@@ -16750,20 +17378,6 @@ var Input = (0, import_react6.forwardRef)(({ value: controlledValue, defaultValu
16750
17378
  // _build/lib/react-qw/components/Link.js
16751
17379
  var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1);
16752
17380
  var import_react7 = __toESM(require_react(), 1);
16753
- import * as gui8 from "gui";
16754
- import * as ffi6 from "ffi";
16755
- function readUtf16(ptr, offset, maxWords) {
16756
- const chars = [];
16757
- for (let i = 0; i < maxWords; i++) {
16758
- const lo = ffi6.readByte(ptr + offset + i * 2);
16759
- const hi = ffi6.readByte(ptr + offset + i * 2 + 1);
16760
- const code = hi << 8 | lo;
16761
- if (code === 0)
16762
- break;
16763
- chars.push(String.fromCharCode(code));
16764
- }
16765
- return chars.join("");
16766
- }
16767
17381
  var Link = (0, import_react7.forwardRef)(function Link2({ href, children, onClick, style }, ref) {
16768
17382
  const displayText = children != null ? String(children) : href ?? "";
16769
17383
  const linkText = href ? `<A HREF="${href}">${displayText}</A>` : displayText;
@@ -16774,14 +17388,13 @@ var Link = (0, import_react7.forwardRef)(function Link2({ href, children, onClic
16774
17388
  const h = linkRef.current;
16775
17389
  if (!h)
16776
17390
  return;
16777
- gui8.InvalidateRect(h, null, true);
17391
+ InvalidateRect(h, NULL, 1);
16778
17392
  }, [linkText]);
16779
17393
  return (0, import_jsx_runtime6.jsx)("w", { type: "STATIC", ws: 268435456 | 33554432, style: { ...style, flexDirection: "column", alignItems: "stretch" }, ref, onEvent: (e) => {
16780
17394
  if (e.msg === 78) {
16781
17395
  const code = nmCode(e.lParam);
16782
17396
  if (code === -2 || code === -4) {
16783
- const url = readUtf16(e.lParam, NMHDR_SIZE + 112, 2048);
16784
- onClickRef.current?.(url);
17397
+ onClickRef.current?.(NMLINK.decode(e.lParam).item.szUrl);
16785
17398
  }
16786
17399
  }
16787
17400
  }, children: (0, import_jsx_runtime6.jsx)("w", { type: "SysLink", ws: 268435456 | 65536, text: linkText, style: { flexGrow: 1 }, ref: (h) => {
@@ -16792,7 +17405,7 @@ var Link = (0, import_react7.forwardRef)(function Link2({ href, children, onClic
16792
17405
  // _build/lib/react-qw/components/ListBox.js
16793
17406
  var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1);
16794
17407
  var import_react8 = __toESM(require_react(), 1);
16795
- import * as gui9 from "gui";
17408
+ import * as gui8 from "gui";
16796
17409
  var ListBox = (0, import_react8.forwardRef)(({ items, selectedIndex: controlledIndex, defaultSelectedIndex = -1, onChange, style, sort, scrollToBottom }, ref) => {
16797
17410
  const [internalIndex, setInternalIndex] = (0, import_react8.useState)(defaultSelectedIndex);
16798
17411
  const isControlled = controlledIndex !== void 0;
@@ -16804,18 +17417,18 @@ var ListBox = (0, import_react8.forwardRef)(({ items, selectedIndex: controlledI
16804
17417
  const h = lbRef.current;
16805
17418
  if (!h)
16806
17419
  return;
16807
- gui9.SendMessage(h, 388, 0, 0);
17420
+ gui8.SendMessage(h, 388, 0, 0);
16808
17421
  for (const item of items)
16809
- gui9.SendMessage(h, 384, 0, item);
17422
+ gui8.SendMessage(h, 384, 0, item);
16810
17423
  if (sel >= 0 && sel < items.length)
16811
- gui9.SendMessage(h, 390, sel, 0);
17424
+ gui8.SendMessage(h, 390, sel, 0);
16812
17425
  if (scrollToBottom && items.length > 0)
16813
- gui9.SendMessage(h, 407, items.length - 1, 0);
17426
+ gui8.SendMessage(h, 407, items.length - 1, 0);
16814
17427
  }, [items]);
16815
17428
  (0, import_react8.useEffect)(() => {
16816
17429
  const h = lbRef.current;
16817
17430
  if (h)
16818
- gui9.SendMessage(h, 390, sel, 0);
17431
+ gui8.SendMessage(h, 390, sel, 0);
16819
17432
  }, [sel]);
16820
17433
  return (0, import_jsx_runtime7.jsx)("w", { type: "STATIC", ws: 268435456 | 33554432, style: { ...style, flexDirection: "column", alignItems: "stretch" }, onEvent: (e) => {
16821
17434
  if (e.msg !== 273)
@@ -16825,7 +17438,7 @@ var ListBox = (0, import_react8.forwardRef)(({ items, selectedIndex: controlledI
16825
17438
  const h = lbRef.current;
16826
17439
  if (!h)
16827
17440
  return;
16828
- const newSel = gui9.SendMessage(h, 392, 0, 0);
17441
+ const newSel = gui8.SendMessage(h, 392, 0, 0);
16829
17442
  if (newSel !== sel && newSel >= 0) {
16830
17443
  if (!isControlled)
16831
17444
  setInternalIndex(newSel);
@@ -16840,150 +17453,30 @@ var ListBox = (0, import_react8.forwardRef)(({ items, selectedIndex: controlledI
16840
17453
  // _build/lib/react-qw/components/ListView.js
16841
17454
  var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1);
16842
17455
  var import_react9 = __toESM(require_react(), 1);
16843
- import * as gui10 from "gui";
16844
- import * as ffi7 from "ffi";
16845
- import * as win2 from "win";
17456
+ import * as gui9 from "gui";
17457
+ import * as ffi3 from "ffi";
16846
17458
  function makeColorBlock(size, bgra) {
16847
17459
  const n = size * size;
16848
17460
  const buf = new ArrayBuffer(n * 4);
16849
- const b = new Uint8Array(buf);
17461
+ const b6 = new Uint8Array(buf);
16850
17462
  for (let i = 0; i < n; i++) {
16851
- b[i * 4] = bgra & 255;
16852
- b[i * 4 + 1] = bgra >> 8 & 255;
16853
- b[i * 4 + 2] = bgra >> 16 & 255;
16854
- b[i * 4 + 3] = 255;
17463
+ b6[i * 4] = bgra & 255;
17464
+ b6[i * 4 + 1] = bgra >> 8 & 255;
17465
+ b6[i * 4 + 2] = bgra >> 16 & 255;
17466
+ b6[i * 4 + 3] = 255;
16855
17467
  }
16856
17468
  return buf;
16857
17469
  }
16858
- function textToUtf162(s) {
16859
- const buf = new ArrayBuffer((s.length + 1) * 2);
16860
- const dv = new DataView(buf);
16861
- for (let i = 0; i < s.length; i++)
16862
- dv.setUint16(i * 2, s.charCodeAt(i), true);
16863
- return buf;
16864
- }
16865
- function readI32(ptr, offset) {
16866
- return ffi7.readByte(ptr + offset) | ffi7.readByte(ptr + offset + 1) << 8 | ffi7.readByte(ptr + offset + 2) << 16 | ffi7.readByte(ptr + offset + 3) << 24;
16867
- }
16868
- function readU32(ptr, offset) {
16869
- return ffi7.readByte(ptr + offset) | ffi7.readByte(ptr + offset + 1) << 8 | ffi7.readByte(ptr + offset + 2) << 16 | ffi7.readByte(ptr + offset + 3) << 24 >>> 0;
16870
- }
16871
- function readU64(ptr, offset) {
16872
- const lo = readU32(ptr, offset);
16873
- const hi = readU32(ptr, offset + 4);
16874
- return lo + hi * 4294967296;
16875
- }
16876
17470
  function writeU32(ptr, offset, v) {
16877
- ffi7.writeByte(ptr + offset, v & 255);
16878
- ffi7.writeByte(ptr + offset + 1, v >> 8 & 255);
16879
- ffi7.writeByte(ptr + offset + 2, v >> 16 & 255);
16880
- ffi7.writeByte(ptr + offset + 3, v >> 24 & 255);
16881
- }
16882
- function bufPtr2(buf) {
16883
- return ffi7.bufferPtr(buf);
17471
+ ffi3.writeByte(ptr + offset, v & 255);
17472
+ ffi3.writeByte(ptr + offset + 1, v >> 8 & 255);
17473
+ ffi3.writeByte(ptr + offset + 2, v >> 16 & 255);
17474
+ ffi3.writeByte(ptr + offset + 3, v >> 24 & 255);
16884
17475
  }
16885
17476
  var LV_WS = 268435456 | 8388608 | 2097152 | 1048576 | 1 | 4;
16886
- var NMCUSTOMDRAW = struct({
16887
- hdr: NMHDR,
16888
- dwDrawStage: "u32",
16889
- hdc: "ptr",
16890
- rc: "i32[4]",
16891
- dwItemSpec: "ptr",
16892
- uItemState: "u32",
16893
- lItemlParam: "ptr"
16894
- });
16895
- var NMLVCUSTOMDRAW = struct({
16896
- hdr: NMHDR,
16897
- dwDrawStage: "u32",
16898
- hdc: "ptr",
16899
- rc: "i32[4]",
16900
- dwItemSpec: "ptr",
16901
- uItemState: "u32",
16902
- lItemlParam: "ptr",
16903
- clrText: "u32",
16904
- clrTextBk: "u32",
16905
- iSubItem: "i32",
16906
- dwItemType: "u32"
16907
- });
16908
- var NMLISTVIEW = struct({
16909
- hdr: NMHDR,
16910
- iItem: "i32",
16911
- iSubItem: "i32",
16912
- uNewState: "u32",
16913
- uOldState: "u32",
16914
- uChanged: "u32",
16915
- ptAction: "i32[2]",
16916
- lParam: "ptr"
16917
- });
16918
- var CD_STAGE = NMCUSTOMDRAW.offsetOf("dwDrawStage");
16919
- var CD_HDC = NMCUSTOMDRAW.offsetOf("hdc");
16920
- var CD_ITEM = NMCUSTOMDRAW.offsetOf("dwItemSpec");
16921
17477
  var CD_CLRTEXT = NMLVCUSTOMDRAW.offsetOf("clrText");
16922
17478
  var CD_CLRTEXTBK = NMLVCUSTOMDRAW.offsetOf("clrTextBk");
16923
- var CD_SUBITEM = NMLVCUSTOMDRAW.offsetOf("iSubItem");
16924
- var NMIA_ITEM = NMLISTVIEW.offsetOf("iItem");
16925
- var NMIA_SUBITEM = NMLISTVIEW.offsetOf("iSubItem");
16926
- var NMLV_UNEW = NMLISTVIEW.offsetOf("uNewState");
16927
- var NMLV_UOLD = NMLISTVIEW.offsetOf("uOldState");
16928
- var LVITEMW = struct({
16929
- mask: "u32",
16930
- iItem: "i32",
16931
- iSubItem: "i32",
16932
- state: "u32",
16933
- stateMask: "u32",
16934
- pszText: "ptr",
16935
- cchTextMax: "i32",
16936
- iImage: "i32",
16937
- lParam: "ptr",
16938
- iIndent: "i32",
16939
- iGroupId: "i32",
16940
- cColumns: "u32",
16941
- puColumns: "ptr",
16942
- piColFmt: "ptr",
16943
- iGroup: "i32"
16944
- });
16945
- var LVCOLUMNW = struct({
16946
- mask: "u32",
16947
- fmt: "i32",
16948
- cx: "i32",
16949
- pszText: "ptr",
16950
- cchTextMax: "i32",
16951
- iSubItem: "i32",
16952
- iImage: "i32",
16953
- iOrder: "i32",
16954
- cxMin: "i32",
16955
- cxDefault: "i32",
16956
- cxIdeal: "i32"
16957
- });
16958
17479
  var fontCache = /* @__PURE__ */ new Map();
16959
- var gdi322 = null;
16960
- var createFontIndirectW = null;
16961
- var selectObjectFn = null;
16962
- var getObjectW = null;
16963
- function ensureGdi() {
16964
- if (gdi322 !== null)
16965
- return;
16966
- gdi322 = win2.LoadLibrary("gdi32.dll");
16967
- if (!gdi322)
16968
- return;
16969
- createFontIndirectW = win2.GetProcAddress(gdi322, "CreateFontIndirectW");
16970
- selectObjectFn = win2.GetProcAddress(gdi322, "SelectObject");
16971
- getObjectW = win2.GetProcAddress(gdi322, "GetObjectW");
16972
- }
16973
- var user322 = null;
16974
- var loadCursorW = null;
16975
- var setCursorFn = null;
16976
- var screenToClient = null;
16977
- function ensureUser32() {
16978
- if (user322 !== null)
16979
- return;
16980
- user322 = win2.LoadLibrary("user32.dll");
16981
- if (!user322)
16982
- return;
16983
- loadCursorW = win2.GetProcAddress(user322, "LoadCursorW");
16984
- setCursorFn = win2.GetProcAddress(user322, "SetCursor");
16985
- screenToClient = win2.GetProcAddress(user322, "ScreenToClient");
16986
- }
16987
17480
  function getCellFont(hwnd, style) {
16988
17481
  const key = (style.bold ? "b" : "") + (style.italic ? "i" : "") + (style.underline ? "u" : "");
16989
17482
  if (key === "")
@@ -16991,39 +17484,37 @@ function getCellFont(hwnd, style) {
16991
17484
  const cached = fontCache.get(key);
16992
17485
  if (cached !== void 0)
16993
17486
  return cached === 0 ? null : cached;
16994
- ensureGdi();
16995
- if (!createFontIndirectW || !getObjectW || !hwnd)
17487
+ if (!hwnd)
16996
17488
  return null;
16997
- const lf = new ArrayBuffer(92);
16998
- const dv = new DataView(lf);
16999
- const cur = gui10.SendMessage(hwnd, 49, 0, 0);
17489
+ let base = { lfHeight: -13 };
17490
+ const cur = gui9.SendMessage(hwnd, 49, 0, 0);
17000
17491
  if (cur) {
17001
- const got = ffi7.ffiCall(getObjectW, [ffi7.FFI_TYPE_POINTER, ffi7.FFI_TYPE_SINT32, ffi7.FFI_TYPE_POINTER], [cur, 92, lf], ffi7.FFI_TYPE_SINT32);
17002
- if (!got)
17492
+ const lf = LOGFONTW.alloc();
17493
+ if (!GetObject(cur, LOGFONTW.size, lf))
17003
17494
  return null;
17004
- } else {
17005
- dv.setInt32(0, -13, true);
17495
+ base = LOGFONTW.decode(lf);
17006
17496
  }
17007
- if (style.bold)
17008
- dv.setInt32(16, 700, true);
17009
- if (style.italic)
17010
- dv.setUint8(20, 1);
17011
- if (style.underline)
17012
- dv.setUint8(21, 1);
17013
- const h = ffi7.ffiCall(createFontIndirectW, [ffi7.FFI_TYPE_POINTER], [lf], ffi7.FFI_TYPE_POINTER);
17497
+ const h = CreateFontIndirect({
17498
+ ...base,
17499
+ ...style.bold ? {
17500
+ lfWeight: 700
17501
+ /* gui.FontWeight.BOLD */
17502
+ } : {},
17503
+ ...style.italic ? { lfItalic: 1 } : {},
17504
+ ...style.underline ? { lfUnderline: 1 } : {}
17505
+ });
17014
17506
  fontCache.set(key, h ? h : 0);
17015
17507
  return h ? h : null;
17016
17508
  }
17017
17509
  function handleCustomDraw(lParam, columns2, data2, hwnd) {
17018
- const stage = readU32(lParam, CD_STAGE);
17510
+ const { dwDrawStage: stage } = NMCUSTOMDRAW.decode(lParam);
17019
17511
  if (stage === 1)
17020
17512
  return 32;
17021
17513
  if (stage === 65537)
17022
17514
  return 32;
17023
17515
  if (stage === 196609) {
17024
- const colIndex = readI32(lParam, CD_SUBITEM);
17025
- const row = readI32(lParam, CD_ITEM);
17026
- const style = resolveCellStyle(columns2, data2, row, colIndex);
17516
+ const cd = NMLVCUSTOMDRAW.decode(lParam);
17517
+ const style = resolveCellStyle(columns2, data2, cd.dwItemSpec, cd.iSubItem);
17027
17518
  if (!style)
17028
17519
  return 0;
17029
17520
  if (style.color !== void 0)
@@ -17031,12 +17522,9 @@ function handleCustomDraw(lParam, columns2, data2, hwnd) {
17031
17522
  if (style.background !== void 0)
17032
17523
  writeU32(lParam, CD_CLRTEXTBK, style.background);
17033
17524
  const hfont = getCellFont(hwnd, style);
17034
- if (hfont && selectObjectFn) {
17035
- const hdc = PTR_SIZE === 8 ? readU64(lParam, CD_HDC) : readU32(lParam, CD_HDC);
17036
- if (hdc) {
17037
- ffi7.ffiCall(selectObjectFn, [ffi7.FFI_TYPE_POINTER, ffi7.FFI_TYPE_POINTER], [hdc, hfont], ffi7.FFI_TYPE_POINTER);
17038
- return 2;
17039
- }
17525
+ if (hfont && cd.hdc) {
17526
+ SelectObject(cd.hdc, hfont);
17527
+ return 2;
17040
17528
  }
17041
17529
  }
17042
17530
  return 0;
@@ -17067,14 +17555,14 @@ function resolveCellStyle(columns2, data2, row, colIndex) {
17067
17555
  return style || void 0;
17068
17556
  }
17069
17557
  function makeLVItem(i, sub, text, image) {
17070
- const textBuf = textToUtf162(text);
17071
- const b = LVITEMW.write({
17558
+ const textBuf = WCHAR.encode(text);
17559
+ const b6 = LVITEMW.encode({
17072
17560
  mask: 1 | (image !== void 0 ? 2 : 0),
17073
17561
  iItem: i,
17074
17562
  iSubItem: sub,
17075
17563
  state: 0,
17076
17564
  stateMask: 0,
17077
- pszText: bufPtr2(textBuf),
17565
+ pszText: textBuf.ptr,
17078
17566
  cchTextMax: 0,
17079
17567
  iImage: image ?? 0,
17080
17568
  lParam: 0,
@@ -17085,8 +17573,8 @@ function makeLVItem(i, sub, text, image) {
17085
17573
  piColFmt: 0,
17086
17574
  iGroup: 0
17087
17575
  });
17088
- b.__textBuf = textBuf;
17089
- return b;
17576
+ b6.__textBuf = textBuf;
17577
+ return b6;
17090
17578
  }
17091
17579
  var ListView = (0, import_react9.forwardRef)(function ListViewInner({ columns: columns2, data: data2, style, icons: icons2, iconSize, getIcon }, ref) {
17092
17580
  const lvRef = (0, import_react9.useRef)(null);
@@ -17098,36 +17586,36 @@ var ListView = (0, import_react9.forwardRef)(function ListViewInner({ columns: c
17098
17586
  const il = iconListRef.current;
17099
17587
  iconListRef.current = 0;
17100
17588
  if (il) {
17101
- gui10.SendMessage(h, 4099, 1, 0);
17102
- gui10.ImageListDestroy(il);
17589
+ gui9.SendMessage(h, 4099, 1, 0);
17590
+ gui9.ImageListDestroy(il);
17103
17591
  }
17104
17592
  if (!icons2 || icons2.length === 0)
17105
17593
  return;
17106
17594
  const size = iconSize ?? 32;
17107
- const img = gui10.ImageListCreate(size, size, 32, icons2.length, 1);
17595
+ const img = gui9.ImageListCreate(size, size, 32, icons2.length, 1);
17108
17596
  if (!img)
17109
17597
  return;
17110
17598
  for (const p of icons2) {
17111
- const hbm = gui10.CreateBitmapFromPixels(size, size, p);
17599
+ const hbm = gui9.CreateBitmapFromPixels(size, size, p);
17112
17600
  if (hbm) {
17113
- gui10.ImageListAdd(img, hbm);
17114
- gui10.DeleteObject(hbm);
17601
+ gui9.ImageListAdd(img, hbm);
17602
+ DeleteObject(hbm);
17115
17603
  }
17116
17604
  }
17117
- gui10.SendMessage(h, 4099, 1, img);
17605
+ gui9.SendMessage(h, 4099, 1, img);
17118
17606
  iconListRef.current = img;
17119
17607
  }, [icons2, iconSize]);
17120
17608
  (0, import_react9.useEffect)(() => {
17121
17609
  const h = lvRef.current;
17122
17610
  if (!h)
17123
17611
  return;
17124
- const hdr = gui10.SendMessage(h, 4127, 0, 0);
17612
+ const hdr = gui9.SendMessage(h, 4127, 0, 0);
17125
17613
  if (hdr) {
17126
- let n2 = gui10.SendMessage(hdr, 4608, 0, 0);
17614
+ let n2 = gui9.SendMessage(hdr, 4608, 0, 0);
17127
17615
  for (let k = n2 - 1; k >= 0; k--)
17128
- gui10.SendMessage(h, 4124, k, 0);
17616
+ gui9.SendMessage(h, 4124, k, 0);
17129
17617
  }
17130
- gui10.SendMessage(
17618
+ gui9.SendMessage(
17131
17619
  h,
17132
17620
  4150,
17133
17621
  0,
@@ -17136,12 +17624,12 @@ var ListView = (0, import_react9.forwardRef)(function ListViewInner({ columns: c
17136
17624
  );
17137
17625
  const n = columns2.length;
17138
17626
  for (let j = 0; j < n; j++) {
17139
- const titleBuf = textToUtf162(columns2[j].name);
17140
- const lvc = LVCOLUMNW.write({
17627
+ const titleBuf = WCHAR.encode(columns2[j].name);
17628
+ const lvc = LVCOLUMNW.encode({
17141
17629
  mask: 4 | 2 | 1,
17142
17630
  fmt: alignToFmt(columns2[j].align),
17143
17631
  cx: columns2[j].width ?? 100,
17144
- pszText: bufPtr2(titleBuf),
17632
+ pszText: titleBuf.ptr,
17145
17633
  cchTextMax: 0,
17146
17634
  iSubItem: j,
17147
17635
  iImage: 0,
@@ -17151,28 +17639,28 @@ var ListView = (0, import_react9.forwardRef)(function ListViewInner({ columns: c
17151
17639
  cxIdeal: 0
17152
17640
  });
17153
17641
  lvc.__titleBuf = titleBuf;
17154
- gui10.SendMessage(h, 4193, j, bufPtr2(lvc));
17642
+ gui9.SendMessage(h, 4193, j, lvc.ptr);
17155
17643
  }
17156
17644
  }, [columns2]);
17157
17645
  (0, import_react9.useEffect)(() => {
17158
17646
  const h = lvRef.current;
17159
17647
  if (!h)
17160
17648
  return;
17161
- gui10.SendMessage(h, 4105, 0, 0);
17649
+ gui9.SendMessage(h, 4105, 0, 0);
17162
17650
  const nCols = columns2.length;
17163
17651
  for (let i = 0; i < data2.length; i++) {
17164
17652
  const record = data2[i];
17165
17653
  const img = getIcon ? getIcon(record, i) : void 0;
17166
17654
  const itemBuf = makeLVItem(i, 0, cellText(record, columns2[0], i), img);
17167
- gui10.SendMessage(h, 4173, 0, bufPtr2(itemBuf));
17655
+ gui9.SendMessage(h, 4173, 0, itemBuf.ptr);
17168
17656
  for (let j = 1; j < nCols; j++) {
17169
17657
  const subBuf = makeLVItem(i, j, cellText(record, columns2[j], i));
17170
- gui10.SendMessage(h, 4172, 0, bufPtr2(subBuf));
17658
+ gui9.SendMessage(h, 4172, 0, subBuf.ptr);
17171
17659
  }
17172
17660
  }
17173
17661
  for (let j = 0; j < columns2.length; j++) {
17174
17662
  if (columns2[j].width == null) {
17175
- gui10.SendMessage(
17663
+ gui9.SendMessage(
17176
17664
  h,
17177
17665
  4126,
17178
17666
  j,
@@ -17189,14 +17677,12 @@ var ListView = (0, import_react9.forwardRef)(function ListViewInner({ columns: c
17189
17677
  return handleCustomDraw(e.lParam, columns2, data2, lvRef.current);
17190
17678
  }
17191
17679
  if (code === -100) {
17192
- const uNewState = readU32(e.lParam, NMLV_UNEW);
17193
- const uOldState = readU32(e.lParam, NMLV_UOLD);
17680
+ const { uNewState, uOldState } = NMLISTVIEW.decode(e.lParam);
17194
17681
  if ((uNewState & 2) !== (uOldState & 2))
17195
17682
  return 1;
17196
17683
  }
17197
17684
  if (code === -2) {
17198
- const iItem = readI32(e.lParam, NMIA_ITEM);
17199
- const iSubItem = readI32(e.lParam, NMIA_SUBITEM);
17685
+ const { iItem, iSubItem } = NMLISTVIEW.decode(e.lParam);
17200
17686
  const col = columns2[iSubItem];
17201
17687
  const record = data2[iItem];
17202
17688
  if (col?.onCellClick && record !== void 0)
@@ -17214,33 +17700,20 @@ var ListView = (0, import_react9.forwardRef)(function ListViewInner({ columns: c
17214
17700
  const h = lvRef.current;
17215
17701
  if (!h)
17216
17702
  return;
17217
- ensureUser32();
17218
- if (!loadCursorW || !setCursorFn || !screenToClient)
17219
- return;
17220
- const sp = gui10.GetCursorPos();
17221
- if (!sp)
17703
+ const pt = POINT.alloc();
17704
+ if (!GetCursorPos(pt.ptr))
17222
17705
  return;
17223
- const sbuf = new ArrayBuffer(8);
17224
- const sdv = new DataView(sbuf);
17225
- sdv.setInt32(0, sp[0], true);
17226
- sdv.setInt32(4, sp[1], true);
17227
- ffi7.ffiCall(screenToClient, [ffi7.FFI_TYPE_POINTER, ffi7.FFI_TYPE_POINTER], [h, sbuf], ffi7.FFI_TYPE_SINT32);
17228
- const lvhi = new ArrayBuffer(24);
17229
- const lvd = new DataView(lvhi);
17230
- lvd.setInt32(0, sdv.getInt32(0, true), true);
17231
- lvd.setInt32(4, sdv.getInt32(4, true), true);
17232
- lvd.setInt32(12, -1, true);
17233
- lvd.setInt32(16, -1, true);
17234
- const lvhiPtr = bufPtr2(lvhi);
17235
- gui10.SendMessage(h, 4153, 0, lvhiPtr);
17236
- const iItem = readI32(lvhiPtr, 12);
17237
- const iSubItem = readI32(lvhiPtr, 16);
17706
+ ScreenToClient(h, pt.ptr);
17707
+ const { x: sx, y: sy } = POINT.decode(pt);
17708
+ const hit = LVHITTESTINFO.encode({ pt: [sx, sy], iItem: -1, iSubItem: -1 });
17709
+ gui9.SendMessage(h, 4153, 0, hit.ptr);
17710
+ const { iItem, iSubItem } = LVHITTESTINFO.decode(hit);
17238
17711
  const style2 = resolveCellStyle(columns2, data2, iItem, iSubItem);
17239
17712
  if (!style2 || style2.cursor === void 0)
17240
17713
  return;
17241
- const hc = ffi7.ffiCall(loadCursorW, [ffi7.FFI_TYPE_POINTER, ffi7.FFI_TYPE_POINTER], [0, style2.cursor], ffi7.FFI_TYPE_POINTER);
17714
+ const hc = LoadCursor(NULL, style2.cursor);
17242
17715
  if (hc) {
17243
- ffi7.ffiCall(setCursorFn, [ffi7.FFI_TYPE_POINTER], [hc], ffi7.FFI_TYPE_POINTER);
17716
+ SetCursor(hc);
17244
17717
  return 1;
17245
17718
  }
17246
17719
  return;
@@ -17250,7 +17723,7 @@ var ListView = (0, import_react9.forwardRef)(function ListViewInner({ columns: c
17250
17723
  // _build/lib/react-qw/components/ProgressBar.js
17251
17724
  var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1);
17252
17725
  var import_react10 = __toESM(require_react(), 1);
17253
- import * as gui11 from "gui";
17726
+ import * as gui10 from "gui";
17254
17727
  var ProgressBar = (0, import_react10.forwardRef)(({ value = 0, max = 100, style, smooth }, ref) => {
17255
17728
  const pbRef = (0, import_react10.useRef)(null);
17256
17729
  const ws = 268435456 | 8388608 | (smooth ? 1 : 0);
@@ -17258,8 +17731,8 @@ var ProgressBar = (0, import_react10.forwardRef)(({ value = 0, max = 100, style,
17258
17731
  const h = pbRef.current;
17259
17732
  if (!h)
17260
17733
  return;
17261
- gui11.SendMessage(h, 1030, 0, max);
17262
- gui11.SendMessage(h, 1026, Math.min(value, max), 0);
17734
+ gui10.SendMessage(h, 1030, 0, max);
17735
+ gui10.SendMessage(h, 1026, Math.min(value, max), 0);
17263
17736
  }, [value, max]);
17264
17737
  return (0, import_jsx_runtime9.jsx)("w", { type: "msctls_progress32", ws, style, ref: (h) => {
17265
17738
  pbRef.current = h;
@@ -17273,7 +17746,7 @@ var ProgressBar = (0, import_react10.forwardRef)(({ value = 0, max = 100, style,
17273
17746
  // _build/lib/react-qw/components/RadioButton.js
17274
17747
  var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1);
17275
17748
  var import_react11 = __toESM(require_react(), 1);
17276
- import * as gui12 from "gui";
17749
+ import * as gui11 from "gui";
17277
17750
  var RadioButton = (0, import_react11.forwardRef)(({ checked: controlledChecked, defaultChecked = false, onChange, label, style, disabled }, ref) => {
17278
17751
  const [internalChecked, setInternalChecked] = (0, import_react11.useState)(defaultChecked);
17279
17752
  const isControlled = controlledChecked !== void 0;
@@ -17283,7 +17756,7 @@ var RadioButton = (0, import_react11.forwardRef)(({ checked: controlledChecked,
17283
17756
  const h = rbRef.current;
17284
17757
  if (!h)
17285
17758
  return;
17286
- gui12.SendMessage(h, 241, displayChecked ? 1 : 0, 0);
17759
+ gui11.SendMessage(h, 241, displayChecked ? 1 : 0, 0);
17287
17760
  }, [displayChecked]);
17288
17761
  return (0, import_jsx_runtime10.jsx)("w", { type: "BUTTON", text: label ?? "", ws: 268435456 | 9, style, disabled, ref: (h) => {
17289
17762
  rbRef.current = h;
@@ -17293,7 +17766,7 @@ var RadioButton = (0, import_react11.forwardRef)(({ checked: controlledChecked,
17293
17766
  ref.current = h;
17294
17767
  }, onEvent: (e) => {
17295
17768
  if (e.msg === 514) {
17296
- const newChecked = gui12.SendMessage(e.hwnd, 240, 0, 0) !== 0;
17769
+ const newChecked = gui11.SendMessage(e.hwnd, 240, 0, 0) !== 0;
17297
17770
  if (newChecked !== displayChecked) {
17298
17771
  if (!isControlled)
17299
17772
  setInternalChecked(newChecked);
@@ -17306,24 +17779,27 @@ var RadioButton = (0, import_react11.forwardRef)(({ checked: controlledChecked,
17306
17779
  // _build/lib/react-qw/components/ScrollView.js
17307
17780
  var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1);
17308
17781
  var import_react12 = __toESM(require_react(), 1);
17309
- import * as gui13 from "gui";
17782
+ import * as gui12 from "gui";
17310
17783
  var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth, contentHeight }, ref) => {
17311
17784
  const svRef = (0, import_react12.useRef)(null);
17312
17785
  const contentRef = (0, import_react12.useRef)(null);
17313
17786
  const scrollXRef = (0, import_react12.useRef)(0);
17314
17787
  const scrollYRef = (0, import_react12.useRef)(0);
17315
17788
  function updateScroll(sv, content) {
17316
- const svRect = gui13.GetClientRect(sv);
17789
+ const svRect = gui12.GetClientRect(sv);
17317
17790
  if (!svRect)
17318
17791
  return;
17319
17792
  const svW = svRect.right - svRect.left;
17320
17793
  const svH = svRect.bottom - svRect.top;
17321
- const scale = gui13.GetScaleFactor();
17794
+ const hdc = GetDC(NULL);
17795
+ const scale = hdc ? GetDeviceCaps(hdc, 88) / 96 : 1;
17796
+ if (hdc)
17797
+ ReleaseDC(NULL, hdc);
17322
17798
  const natW = Math.round((contentWidth ?? svW / scale) * scale);
17323
17799
  const natH = Math.round((contentHeight ?? svH / scale) * scale);
17324
17800
  scrollXRef.current = Math.max(0, Math.min(scrollXRef.current, natW - svW));
17325
17801
  scrollYRef.current = Math.max(0, Math.min(scrollYRef.current, natH - svH));
17326
- gui13.SetWindowPos(
17802
+ SetWindowPos(
17327
17803
  content,
17328
17804
  0,
17329
17805
  -scrollXRef.current,
@@ -17335,18 +17811,18 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17335
17811
  );
17336
17812
  forceFlexLayout(content);
17337
17813
  if (natW > svW) {
17338
- gui13.SetScrollInfo(sv, 0, { min: 0, max: natW - 1, page: svW, pos: scrollXRef.current }, true);
17339
- gui13.ShowScrollBar(sv, 0, true);
17814
+ gui12.SetScrollInfo(sv, 0, { min: 0, max: natW - 1, page: svW, pos: scrollXRef.current }, true);
17815
+ ShowScrollBar(sv, 0, 1);
17340
17816
  } else {
17341
17817
  scrollXRef.current = 0;
17342
- gui13.ShowScrollBar(sv, 0, false);
17818
+ ShowScrollBar(sv, 0, 0);
17343
17819
  }
17344
17820
  if (natH > svH) {
17345
- gui13.SetScrollInfo(sv, 1, { min: 0, max: natH - 1, page: svH, pos: scrollYRef.current }, true);
17346
- gui13.ShowScrollBar(sv, 1, true);
17821
+ gui12.SetScrollInfo(sv, 1, { min: 0, max: natH - 1, page: svH, pos: scrollYRef.current }, true);
17822
+ ShowScrollBar(sv, 1, 1);
17347
17823
  } else {
17348
17824
  scrollYRef.current = 0;
17349
- gui13.ShowScrollBar(sv, 1, false);
17825
+ ShowScrollBar(sv, 1, 0);
17350
17826
  }
17351
17827
  }
17352
17828
  (0, import_react12.useLayoutEffect)(() => {
@@ -17362,7 +17838,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17362
17838
  } else {
17363
17839
  scrollXRef.current = newPos;
17364
17840
  }
17365
- gui13.SetWindowPos(
17841
+ SetWindowPos(
17366
17842
  content,
17367
17843
  0,
17368
17844
  -scrollXRef.current,
@@ -17372,14 +17848,14 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17372
17848
  1 | 4
17373
17849
  /* gui.SetWindowPosFlag.SWP_NOZORDER */
17374
17850
  );
17375
- gui13.SetScrollInfo(sv, bar, { pos: newPos }, true);
17851
+ gui12.SetScrollInfo(sv, bar, { pos: newPos }, true);
17376
17852
  }
17377
17853
  function handleScroll(e, bar) {
17378
17854
  const sv = svRef.current;
17379
17855
  const content = contentRef.current;
17380
17856
  if (!sv || !content)
17381
17857
  return;
17382
- const info = gui13.GetScrollInfo(sv, bar);
17858
+ const info = gui12.GetScrollInfo(sv, bar);
17383
17859
  const maxPos = info.max - info.page + 1;
17384
17860
  const code = e.wParam & 65535;
17385
17861
  const ref_ = bar === 1 ? scrollYRef : scrollXRef;
@@ -17413,7 +17889,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17413
17889
  if (!isHorz && contentHeight === void 0)
17414
17890
  return;
17415
17891
  const bar = isHorz ? 0 : 1;
17416
- const info = gui13.GetScrollInfo(sv, bar);
17892
+ const info = gui12.GetScrollInfo(sv, bar);
17417
17893
  const maxPos = info.max - info.page + 1;
17418
17894
  const ref_ = isHorz ? scrollXRef : scrollYRef;
17419
17895
  let newPos = ref_.current + dy;
@@ -17430,7 +17906,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17430
17906
  }, onEvent: {
17431
17907
  fn: (e) => {
17432
17908
  if (e.msg === 132 || e.msg === 161) {
17433
- return gui13.DefWindowProc(e.hwnd, e.msg, e.wParam, e.lParam);
17909
+ return DefWindowProc(e.hwnd, e.msg, e.wParam, e.lParam);
17434
17910
  }
17435
17911
  if (e.msg === 277) {
17436
17912
  handleScroll(
@@ -17462,7 +17938,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17462
17938
  // _build/lib/react-qw/components/Slider.js
17463
17939
  var import_jsx_runtime12 = __toESM(require_jsx_runtime(), 1);
17464
17940
  var import_react13 = __toESM(require_react(), 1);
17465
- import * as gui14 from "gui";
17941
+ import * as gui13 from "gui";
17466
17942
  var Slider = (0, import_react13.forwardRef)(({ value, onChange, min = 0, max = 100, vertical = false, disabled, style }, ref) => {
17467
17943
  const wrapperRef = (0, import_react13.useRef)(null);
17468
17944
  const sliderRef = (0, import_react13.useRef)(null);
@@ -17471,14 +17947,14 @@ var Slider = (0, import_react13.forwardRef)(({ value, onChange, min = 0, max = 1
17471
17947
  if (!h)
17472
17948
  return;
17473
17949
  const lParam = min & 65535 | (max & 65535) << 16;
17474
- gui14.SendMessage(h, 1030, 0, lParam);
17475
- gui14.SendMessage(h, 1029, 1, value);
17950
+ gui13.SendMessage(h, 1030, 0, lParam);
17951
+ gui13.SendMessage(h, 1029, 1, value);
17476
17952
  }, [min, max]);
17477
17953
  (0, import_react13.useEffect)(() => {
17478
17954
  const h = sliderRef.current;
17479
17955
  if (!h)
17480
17956
  return;
17481
- gui14.SendMessage(h, 1029, 1, value);
17957
+ gui13.SendMessage(h, 1029, 1, value);
17482
17958
  }, [value]);
17483
17959
  const tbStyle = 268435456 | 65536 | 1 | (vertical ? 2 : 0);
17484
17960
  return (0, import_jsx_runtime12.jsx)("w", { type: "STATIC", ws: 268435456 | 33554432, style, ref: (h) => {
@@ -17489,13 +17965,13 @@ var Slider = (0, import_react13.forwardRef)(({ value, onChange, min = 0, max = 1
17489
17965
  ref.current = h;
17490
17966
  }, onEvent: (e) => {
17491
17967
  if (e.msg === 132 || e.msg === 161) {
17492
- return gui14.DefWindowProc(e.hwnd, e.msg, e.wParam, e.lParam);
17968
+ return DefWindowProc(e.hwnd, e.msg, e.wParam, e.lParam);
17493
17969
  }
17494
17970
  if (e.msg === 276 || e.msg === 277) {
17495
17971
  const h = sliderRef.current;
17496
17972
  if (!h)
17497
17973
  return 0;
17498
- const pos = gui14.SendMessage(h, 1024, 0, 0);
17974
+ const pos = gui13.SendMessage(h, 1024, 0, 0);
17499
17975
  onChange?.(pos);
17500
17976
  return 0;
17501
17977
  }
@@ -17508,24 +17984,7 @@ var Slider = (0, import_react13.forwardRef)(({ value, onChange, min = 0, max = 1
17508
17984
  // _build/lib/react-qw/components/Tab.js
17509
17985
  var import_jsx_runtime13 = __toESM(require_jsx_runtime(), 1);
17510
17986
  var import_react14 = __toESM(require_react(), 1);
17511
- import * as gui15 from "gui";
17512
- import * as ffi8 from "ffi";
17513
- var TCITEMW = struct({
17514
- mask: "u32",
17515
- dwState: "u32",
17516
- dwStateMask: "u32",
17517
- pszText: "ptr",
17518
- cchTextMax: "i32",
17519
- iImage: "i32",
17520
- lParam: "ptr"
17521
- });
17522
- function textToUtf163(s) {
17523
- const buf = new ArrayBuffer((s.length + 1) * 2);
17524
- const dv = new DataView(buf);
17525
- for (let i = 0; i < s.length; i++)
17526
- dv.setUint16(i * 2, s.charCodeAt(i), true);
17527
- return buf;
17528
- }
17987
+ import * as gui14 from "gui";
17529
17988
  var Tab = (0, import_react14.forwardRef)(({ tabs, selectedIndex: controlledIndex, defaultSelectedIndex = 0, onChange, style }, ref) => {
17530
17989
  const [internalIndex, setInternalIndex] = (0, import_react14.useState)(defaultSelectedIndex);
17531
17990
  const isControlled = controlledIndex !== void 0;
@@ -17535,27 +17994,27 @@ var Tab = (0, import_react14.forwardRef)(({ tabs, selectedIndex: controlledIndex
17535
17994
  const h = tabHwnd.current;
17536
17995
  if (!h)
17537
17996
  return;
17538
- gui15.SendMessage(h, 4873, 0, 0);
17997
+ gui14.SendMessage(h, 4873, 0, 0);
17539
17998
  for (let i = 0; i < tabs.length; i++) {
17540
- const titleBuf = textToUtf163(tabs[i].title);
17541
- const tci = TCITEMW.write({
17999
+ const titleBuf = WCHAR.encode(tabs[i].title);
18000
+ const tci = TCITEMW.encode({
17542
18001
  mask: 1,
17543
18002
  dwState: 0,
17544
18003
  dwStateMask: 0,
17545
- pszText: ffi8.bufferPtr(titleBuf),
18004
+ pszText: titleBuf.ptr,
17546
18005
  cchTextMax: tabs[i].title.length + 1,
17547
18006
  iImage: 0,
17548
18007
  lParam: 0
17549
18008
  });
17550
- const tciPtr = ffi8.bufferPtr(tci);
17551
- gui15.SendMessage(h, 4926, i, tciPtr);
18009
+ const tciPtr = tci.ptr;
18010
+ gui14.SendMessage(h, 4926, i, tciPtr);
17552
18011
  }
17553
- gui15.SendMessage(h, 4876, sel, 0);
18012
+ gui14.SendMessage(h, 4876, sel, 0);
17554
18013
  }, [tabs]);
17555
18014
  (0, import_react14.useEffect)(() => {
17556
18015
  const h = tabHwnd.current;
17557
18016
  if (h)
17558
- gui15.SendMessage(h, 4876, sel, 0);
18017
+ gui14.SendMessage(h, 4876, sel, 0);
17559
18018
  }, [sel]);
17560
18019
  return (0, import_jsx_runtime13.jsxs)("w", { type: "STATIC", ws: 268435456 | 33554432, style: { ...style, flexDirection: "column", alignItems: "stretch" }, ref, onEvent: (e) => {
17561
18020
  if (e.msg === 78) {
@@ -17564,7 +18023,7 @@ var Tab = (0, import_react14.forwardRef)(({ tabs, selectedIndex: controlledIndex
17564
18023
  return;
17565
18024
  const code = nmCode(e.lParam);
17566
18025
  if (code === -552 || code === -2) {
17567
- const newSel = gui15.SendMessage(h, 4875, 0, 0);
18026
+ const newSel = gui14.SendMessage(h, 4875, 0, 0);
17568
18027
  if (newSel !== sel) {
17569
18028
  if (!isControlled)
17570
18029
  setInternalIndex(newSel);
@@ -17577,54 +18036,17 @@ var Tab = (0, import_react14.forwardRef)(({ tabs, selectedIndex: controlledIndex
17577
18036
 
17578
18037
  // _build/lib/react-qw/components/Tooltip.js
17579
18038
  var import_react15 = __toESM(require_react(), 1);
17580
- import * as gui16 from "gui";
17581
- import * as ffi9 from "ffi";
17582
- var TTTOOLINFOW = struct({
17583
- cbSize: "u32",
17584
- uFlags: "u32",
17585
- hwnd: "ptr",
17586
- uId: "ptr",
17587
- rect: "i32[4]",
17588
- hinst: "ptr",
17589
- lpszText: "ptr",
17590
- lParam: "ptr",
17591
- lpReserved: "ptr"
17592
- // WinXP+ 追加字段(系统 sizeof 含之)
17593
- });
18039
+ import * as gui15 from "gui";
17594
18040
 
17595
18041
  // _build/lib/react-qw/components/TreeView.js
17596
18042
  var import_jsx_runtime14 = __toESM(require_jsx_runtime(), 1);
17597
18043
  var import_react16 = __toESM(require_react(), 1);
17598
- import * as gui17 from "gui";
17599
- import * as ffi10 from "ffi";
17600
- var TVITEM = struct({
17601
- mask: "u32",
17602
- hItem: "ptr",
17603
- state: "u32",
17604
- stateMask: "u32",
17605
- pszText: "ptr",
17606
- cchTextMax: "i32",
17607
- iImage: "i32",
17608
- iSelectedImage: "i32",
17609
- cChildren: "i32",
17610
- lParam: "ptr"
17611
- });
17612
- var TVINSERTSTRUCT = struct({ hParent: "ptr", hInsertAfter: "ptr", item: TVITEM });
17613
- function textToUtf164(s) {
17614
- const buf = new ArrayBuffer((s.length + 1) * 2);
17615
- const dv = new DataView(buf);
17616
- for (let i = 0; i < s.length; i++)
17617
- dv.setUint16(i * 2, s.charCodeAt(i), true);
17618
- return buf;
17619
- }
17620
- function bufPtr3(buf) {
17621
- return ffi10.bufferPtr(buf);
17622
- }
18044
+ import * as gui16 from "gui";
17623
18045
  function buildTvItem(textPtr, cChildren) {
17624
18046
  let mask = 1;
17625
18047
  if (cChildren > 0)
17626
18048
  mask |= 64;
17627
- return TVITEM.write({
18049
+ return TVITEM.encode({
17628
18050
  mask,
17629
18051
  hItem: 0,
17630
18052
  state: 0,
@@ -17640,24 +18062,24 @@ function buildTvItem(textPtr, cChildren) {
17640
18062
  function insertItems(hTree, nodes, parentHandle, hItemMap, keyMap) {
17641
18063
  for (const node of nodes) {
17642
18064
  const cChildren = node.children && node.children.length > 0 ? 1 : 0;
17643
- const textBuf = textToUtf164(node.label);
17644
- const itemBuf = buildTvItem(bufPtr3(textBuf), cChildren);
17645
- const item = TVITEM.read(itemBuf);
17646
- const tvins = TVINSERTSTRUCT.write({ hParent: parentHandle, hInsertAfter: -65536, item });
17647
- const hItem = gui17.SendMessage(hTree, 4402, 0, bufPtr3(tvins));
18065
+ const textBuf = WCHAR.encode(node.label);
18066
+ const itemBuf = buildTvItem(textBuf.ptr, cChildren);
18067
+ const item = TVITEM.decode(itemBuf);
18068
+ const tvins = TVINSERTSTRUCT.encode({ hParent: parentHandle, hInsertAfter: -65536, item });
18069
+ const hItem = gui16.SendMessage(hTree, 4402, 0, tvins.ptr);
17648
18070
  hItemMap.set(hItem, node);
17649
18071
  if (node.key)
17650
18072
  keyMap.set(node.key, hItem);
17651
18073
  if (node.children && node.children.length > 0) {
17652
18074
  insertItems(hTree, node.children, hItem, hItemMap, keyMap);
17653
- gui17.SendMessage(hTree, 4354, 2, hItem);
18075
+ gui16.SendMessage(hTree, 4354, 2, hItem);
17654
18076
  }
17655
18077
  }
17656
18078
  }
17657
18079
  function deleteAllItems(hTree) {
17658
- const n = gui17.SendMessage(hTree, 4357, 0, 0);
18080
+ const n = gui16.SendMessage(hTree, 4357, 0, 0);
17659
18081
  if (n > 0)
17660
- gui17.SendMessage(
18082
+ gui16.SendMessage(
17661
18083
  hTree,
17662
18084
  4353,
17663
18085
  1,
@@ -17689,7 +18111,7 @@ var TreeView = (0, import_react16.forwardRef)(function TreeViewInner({ data: dat
17689
18111
  const h = tvRef.current;
17690
18112
  if (!h)
17691
18113
  return;
17692
- gui17.SendMessage(
18114
+ gui16.SendMessage(
17693
18115
  h,
17694
18116
  4396,
17695
18117
  0,
@@ -17705,7 +18127,7 @@ var TreeView = (0, import_react16.forwardRef)(function TreeViewInner({ data: dat
17705
18127
  return;
17706
18128
  const hItem = keyMapRef.current.get(selKey);
17707
18129
  if (hItem !== void 0)
17708
- gui17.SendMessage(h, 4363, 9, hItem);
18130
+ gui16.SendMessage(h, 4363, 9, hItem);
17709
18131
  }, [selKey]);
17710
18132
  return (0, import_jsx_runtime14.jsx)("w", { type: "STATIC", ws: 268435456 | 33554432, style: { ...style, flexDirection: "column", alignItems: "stretch" }, ref, onEvent: (e) => {
17711
18133
  if (e.msg === 78) {
@@ -17714,7 +18136,7 @@ var TreeView = (0, import_react16.forwardRef)(function TreeViewInner({ data: dat
17714
18136
  const h = tvRef.current;
17715
18137
  if (!h)
17716
18138
  return;
17717
- const hCaret = gui17.SendMessage(h, 4362, 9, 0);
18139
+ const hCaret = gui16.SendMessage(h, 4362, 9, 0);
17718
18140
  const node = hItemMapRef.current.get(hCaret) ?? null;
17719
18141
  const key = node?.key ?? null;
17720
18142
  if (!isControlled)
@@ -17730,153 +18152,63 @@ var TreeView = (0, import_react16.forwardRef)(function TreeViewInner({ data: dat
17730
18152
  // _build/lib/react-qw/components/PathPicker.js
17731
18153
  var import_jsx_runtime15 = __toESM(require_jsx_runtime(), 1);
17732
18154
  var import_react17 = __toESM(require_react(), 1);
17733
- import * as ffi11 from "ffi";
17734
- import * as win3 from "win";
17735
18155
 
17736
- // _build/lib/win-common-structs.js
17737
- var OPENFILENAMEW = struct({
17738
- lStructSize: "u32",
17739
- hwndOwner: "ptr",
17740
- hInstance: "ptr",
17741
- lpstrFilter: "ptr",
17742
- lpstrCustomFilter: "ptr",
17743
- nMaxCustFilter: "u32",
17744
- nFilterIndex: "u32",
17745
- lpstrFile: "ptr",
17746
- nMaxFile: "u32",
17747
- lpstrFileTitle: "ptr",
17748
- nMaxFileTitle: "u32",
17749
- lpstrInitialDir: "ptr",
17750
- lpstrTitle: "ptr",
17751
- Flags: "u32",
17752
- nFileOffset: "u16",
17753
- nFileExtension: "u16",
17754
- lpstrDefExt: "ptr",
17755
- lCustData: "ptr",
17756
- lpfnHook: "ptr",
17757
- lpTemplateName: "ptr",
17758
- pvReserved: "ptr",
17759
- dwReserved: "u32",
17760
- FlagsEx: "u32"
17761
- });
17762
- var BROWSEINFOW = struct({
17763
- hwndOwner: "ptr",
17764
- pidlRoot: "ptr",
17765
- pszDisplayName: "ptr",
17766
- lpszTitle: "ptr",
17767
- ulFlags: "u32",
17768
- lpfn: "ptr",
17769
- lParam: "ptr",
17770
- iImage: "i32"
17771
- });
18156
+ // _build/lib/windows/comdlg32.js
18157
+ var b3 = (name, sig) => bind("comdlg32.dll", name, sig);
18158
+ var GetOpenFileName = /* @__PURE__ */ b3("GetOpenFileNameW", "<OPENFILENAMEW>ptr -> u32");
18159
+
18160
+ // _build/lib/windows/shell32.js
18161
+ var b4 = (name, sig) => bind("shell32.dll", name, sig);
18162
+ var SHBrowseForFolder = /* @__PURE__ */ b4("SHBrowseForFolderW", "<BROWSEINFOW>ptr -> <>ptr");
18163
+ var SHGetPathFromIDList = /* @__PURE__ */ b4("SHGetPathFromIDListW", "<>ptr <BYTE>ptr -> u32");
18164
+
18165
+ // _build/lib/windows/ole32.js
18166
+ var b5 = (name, sig) => bind("ole32.dll", name, sig);
18167
+ var CoTaskMemFree = /* @__PURE__ */ b5("CoTaskMemFree", "<>ptr -> void");
17772
18168
 
17773
18169
  // _build/lib/react-qw/components/PathPicker.js
17774
- var FFI_PTR = ffi11.FFI_TYPE_POINTER;
17775
- var FFI_U32 = ffi11.FFI_TYPE_UINT32;
17776
- var _GetOpenFileNameW = 0;
17777
- var _SHBrowseForFolderW = 0;
17778
- var _SHGetPathFromIDListW = 0;
17779
- var _CoTaskMemFree = 0;
17780
- function ensureDlls() {
17781
- if (_GetOpenFileNameW)
17782
- return true;
17783
- const comdlg32 = win3.LoadLibrary("comdlg32.dll");
17784
- const shell32 = win3.LoadLibrary("shell32.dll");
17785
- const ole32 = win3.LoadLibrary("ole32.dll");
17786
- if (!comdlg32 || !shell32 || !ole32)
17787
- return false;
17788
- const load = (lib, name) => win3.GetProcAddress(lib, name) || 0;
17789
- _GetOpenFileNameW = load(comdlg32, "GetOpenFileNameW");
17790
- _SHBrowseForFolderW = load(shell32, "SHBrowseForFolderW");
17791
- _SHGetPathFromIDListW = load(shell32, "SHGetPathFromIDListW");
17792
- _CoTaskMemFree = load(ole32, "CoTaskMemFree");
17793
- return !!_GetOpenFileNameW && !!_SHBrowseForFolderW && !!_SHGetPathFromIDListW && !!_CoTaskMemFree;
17794
- }
17795
- function strToWide(s) {
17796
- return new TextEncoder("utf-16le").encode(s + "\0").buffer;
17797
- }
17798
- var _decoder = new TextDecoder("utf-16le");
17799
- function wideToStr(buf, offset = 0) {
17800
- const str = _decoder.decode(new Uint8Array(buf, offset));
17801
- const nullIdx = str.indexOf("\0");
17802
- return nullIdx >= 0 ? str.substring(0, nullIdx) : str;
17803
- }
17804
18170
  function openFileDialog(owner, filter, title, multiple) {
17805
- if (!ensureDlls())
17806
- return null;
17807
- const fileBuf = new ArrayBuffer(260 * 2);
17808
- const filterWide = strToWide(filter);
17809
- const titleWide = title ? strToWide(title) : null;
18171
+ const fileBuf = WCHAR.alloc(260);
18172
+ const filterWide = WCHAR.encode(filter);
18173
+ const titleWide = title ? WCHAR.encode(title) : null;
17810
18174
  let flags = 4096 | 2048 | 8;
17811
18175
  if (multiple)
17812
18176
  flags |= 512;
17813
18177
  flags |= 524288;
17814
- const ofn = OPENFILENAMEW.write({
18178
+ const ofn = OPENFILENAMEW.encode({
17815
18179
  lStructSize: OPENFILENAMEW.size,
17816
18180
  hwndOwner: owner,
17817
- hInstance: 0,
17818
- lpstrFilter: ffi11.bufferPtr(filterWide),
17819
- lpstrCustomFilter: 0,
17820
- nMaxCustFilter: 0,
17821
- nFilterIndex: 0,
17822
- lpstrFile: ffi11.bufferPtr(fileBuf),
18181
+ lpstrFilter: filterWide.ptr,
18182
+ lpstrFile: fileBuf.ptr,
17823
18183
  nMaxFile: 260,
17824
- lpstrFileTitle: 0,
17825
- nMaxFileTitle: 0,
17826
- lpstrInitialDir: 0,
17827
- lpstrTitle: titleWide ? ffi11.bufferPtr(titleWide) : 0,
17828
- Flags: flags,
17829
- nFileOffset: 0,
17830
- nFileExtension: 0,
17831
- lpstrDefExt: 0,
17832
- lCustData: 0,
17833
- lpfnHook: 0,
17834
- lpTemplateName: 0,
17835
- pvReserved: 0,
17836
- dwReserved: 0,
17837
- FlagsEx: 0
18184
+ lpstrTitle: titleWide?.ptr ?? 0,
18185
+ Flags: flags
17838
18186
  });
17839
- const ret = ffi11.ffiCall(_GetOpenFileNameW, [FFI_PTR], [ofn], FFI_U32);
18187
+ const ret = GetOpenFileName(ofn.ptr);
17840
18188
  if (!ret)
17841
18189
  return null;
17842
18190
  if (!multiple) {
17843
- return wideToStr(fileBuf);
18191
+ return WCHAR.decode(fileBuf);
17844
18192
  }
17845
- const dir = wideToStr(fileBuf);
17846
- let pos = (dir.length + 1) * 2;
17847
- const files = [];
17848
- while (pos < fileBuf.byteLength) {
17849
- const f = wideToStr(fileBuf, pos);
17850
- if (f.length === 0)
17851
- break;
17852
- files.push(dir + "\\" + f);
17853
- pos += (f.length + 1) * 2;
17854
- }
17855
- if (files.length === 0)
17856
- return [dir];
17857
- return files;
18193
+ const strs = new TextDecoder("utf-16le").decode(new Uint8Array(fileBuf)).split("\0");
18194
+ const dir = strs[0] ?? "";
18195
+ const files = strs.slice(1).filter((f) => f.length > 0).map((f) => dir + "\\" + f);
18196
+ return files.length > 0 ? files : [dir];
17858
18197
  }
17859
18198
  function openFolderDialog(owner, title) {
17860
- if (!ensureDlls())
17861
- return null;
17862
- const titleWide = title ? strToWide(title) : null;
17863
- const bi = BROWSEINFOW.write({
18199
+ const titleWide = title ? WCHAR.encode(title) : null;
18200
+ const bi = BROWSEINFOW.encode({
17864
18201
  hwndOwner: owner,
17865
- pidlRoot: 0,
17866
- pszDisplayName: 0,
17867
- lpszTitle: titleWide ? ffi11.bufferPtr(titleWide) : 0,
17868
- ulFlags: 65,
17869
- lpfn: 0,
17870
- lParam: 0,
17871
- iImage: 0
18202
+ lpszTitle: titleWide?.ptr ?? 0,
18203
+ ulFlags: 65
17872
18204
  });
17873
- const pidl = ffi11.ffiCall(_SHBrowseForFolderW, [FFI_PTR], [bi], FFI_PTR);
18205
+ const pidl = SHBrowseForFolder(bi.ptr);
17874
18206
  if (!pidl)
17875
18207
  return null;
17876
- const pathBuf = new ArrayBuffer(260 * 2);
17877
- const ok = ffi11.ffiCall(_SHGetPathFromIDListW, [ffi11.FFI_TYPE_POINTER, FFI_PTR], [pidl, pathBuf], FFI_U32);
17878
- ffi11.ffiCall(_CoTaskMemFree, [ffi11.FFI_TYPE_POINTER], [pidl], ffi11.FFI_TYPE_VOID);
17879
- return ok ? wideToStr(pathBuf) : null;
18208
+ const pathBuf = WCHAR.alloc(260);
18209
+ const ok = SHGetPathFromIDList(pidl, pathBuf);
18210
+ CoTaskMemFree(pidl);
18211
+ return ok ? WCHAR.decode(pathBuf) : null;
17880
18212
  }
17881
18213
  var PathPicker = (0, import_react17.forwardRef)((props, ref) => {
17882
18214
  const { type = "file", filter = "All Files\0*.*\0\0", title, disabled, style } = props;
@@ -17927,7 +18259,7 @@ var rootMap = /* @__PURE__ */ new Map();
17927
18259
  function ensureDefaultClass() {
17928
18260
  if (defaultClassRegistered)
17929
18261
  return DEFAULT_CLASS;
17930
- gui18.RegisterClass(DEFAULT_CLASS, (hwnd, msg, wParam, lParam) => {
18262
+ gui17.RegisterClass(DEFAULT_CLASS, (hwnd, msg, wParam, lParam) => {
17931
18263
  const entry = rootMap.get(hwnd);
17932
18264
  if (msg === 2 && entry) {
17933
18265
  rootMap.delete(hwnd);
@@ -17940,7 +18272,7 @@ function ensureDefaultClass() {
17940
18272
  return result;
17941
18273
  if (msg === 5)
17942
18274
  forceFlexLayout(hwnd);
17943
- return gui18.DefWindowProc(hwnd, msg, wParam, lParam);
18275
+ return DefWindowProc(hwnd, msg, wParam, lParam);
17944
18276
  });
17945
18277
  defaultClassRegistered = true;
17946
18278
  return DEFAULT_CLASS;
@@ -17953,19 +18285,19 @@ function createRoot(container) {
17953
18285
  const ws = (cfg.ws ?? 0) | 13565952;
17954
18286
  const w = (cfg.width ?? 800) * scaleFactor;
17955
18287
  const h = (cfg.height ?? 600) * scaleFactor;
17956
- const [sw, sh] = gui18.GetScreenSize();
18288
+ const [sw, sh] = [GetSystemMetrics(0), GetSystemMetrics(1)];
17957
18289
  const x = cfg.x === void 0 ? (sw - w) / 2 | 0 : cfg.x === -2147483648 ? -2147483648 : cfg.x * scaleFactor;
17958
18290
  const y = cfg.y === void 0 ? (sh - h) / 2 | 0 : cfg.y === -2147483648 ? -2147483648 : cfg.y * scaleFactor;
17959
- const hwin = gui18.CreateWindow(className, cfg.text || "", ws, x, y, w, h, null, null);
18291
+ const hwin = gui17.CreateWindow(className, cfg.text || "", ws, x, y, w, h, null, null);
17960
18292
  if (!hwin)
17961
18293
  throw new Error("CreateWindow failed");
17962
18294
  hwnd = hwin;
17963
18295
  if (!cfg.noShowWindow)
17964
- gui18.ShowWindow(hwnd);
18296
+ gui17.ShowWindow(hwnd);
17965
18297
  } else {
17966
18298
  hwnd = container;
17967
18299
  }
17968
- const root = reconciler_default.createContainer(hwnd, 0, null, false, null, "", noop, noop, noop, noop);
18300
+ const root = reconciler_default.createContainer(hwnd, 0, null, false, null, "", (error, info) => console.log("[React uncaught]", error, error.stack, info.componentStack), (error, info) => console.log("[React caught]", error, error.stack, info.componentStack), (error, info) => console.log("[React recoverable]", error, error.stack, info.componentStack), noop);
17969
18301
  const rootInst = { hwnd, type: "_root", props: { type: "_root", style: { flexDirection: "column", alignItems: "stretch" } }, children: [] };
17970
18302
  instancesByHwnd.set(hwnd, rootInst);
17971
18303
  if (typeof container === "object")
@@ -18036,7 +18368,7 @@ createRoot({
18036
18368
  onEvent: (e) => {
18037
18369
  if (e.msg === 16) {
18038
18370
  console.log("test_react_listview_link done clicks=" + clicks);
18039
- std.exit(0);
18371
+ std2.exit(0);
18040
18372
  }
18041
18373
  }
18042
18374
  }).render((0, import_jsx_runtime16.jsx)(App, {}));