quickwin 2.2.0 → 2.3.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 (111) hide show
  1. package/README.en.md +7 -7
  2. package/README.md +7 -7
  3. package/constants.ts +1063 -0
  4. package/enum_map.d.ts +129 -0
  5. package/examples/PdfCanvas.js +2 -2
  6. package/examples/PdfCanvas.tsx +3 -2
  7. package/examples/{execd.js → execd/main.js} +563 -122
  8. package/examples/execd/tray.js +192 -0
  9. package/examples/{execd_worker.js → execd/worker.js} +7 -7
  10. package/examples/pdf_preview2.js +46 -46
  11. package/examples/pdf_preview2.ts +55 -54
  12. package/examples/pdf_viewer.js +34 -19
  13. package/examples/pdf_viewer.tsx +6 -5
  14. package/examples/test_gallery.js +35 -20
  15. package/examples/test_gallery.tsx +9 -8
  16. package/examples/test_react_lazy.js +34 -19
  17. package/examples/test_react_lazy.tsx +7 -6
  18. package/examples/test_react_listbox.js +34 -19
  19. package/examples/test_react_listbox.tsx +8 -7
  20. package/examples/test_root_window.js +34 -19
  21. package/examples/test_root_window.tsx +5 -5
  22. package/examples/test_tab.js +34 -19
  23. package/examples/test_tab.tsx +7 -6
  24. package/examples/tray_demo.js +8 -8
  25. package/examples/tray_demo.tsx +9 -8
  26. package/lib/dumpRects.js +2 -2
  27. package/lib/dumpRects.ts +3 -2
  28. package/lib/fetch.js +15 -15
  29. package/lib/fetch.ts +16 -15
  30. package/lib/ffi/bind.js +3 -3
  31. package/lib/ffi/bind.ts +3 -3
  32. package/lib/http-server.js +4 -4
  33. package/lib/http-server.ts +5 -4
  34. package/lib/react-qw/components/Button.js +2 -2
  35. package/lib/react-qw/components/CheckBox.js +4 -4
  36. package/lib/react-qw/components/ComboBox.js +10 -10
  37. package/lib/react-qw/components/DateTimePicker.js +12 -12
  38. package/lib/react-qw/components/Input.js +7 -7
  39. package/lib/react-qw/components/Link.js +4 -4
  40. package/lib/react-qw/components/ListBox.js +12 -12
  41. package/lib/react-qw/components/ListView.js +35 -35
  42. package/lib/react-qw/components/PathPicker.js +3 -3
  43. package/lib/react-qw/components/ProgressBar.js +4 -4
  44. package/lib/react-qw/components/RadioButton.js +4 -4
  45. package/lib/react-qw/components/ScrollView.js +28 -28
  46. package/lib/react-qw/components/Slider.js +11 -11
  47. package/lib/react-qw/components/Tab.js +10 -10
  48. package/lib/react-qw/components/Tooltip.js +8 -8
  49. package/lib/react-qw/components/TreeView.js +20 -20
  50. package/lib/react-qw/index.js +5 -5
  51. package/lib/react-qw/index.ts +6 -5
  52. package/lib/react-qw/props.js +4 -4
  53. package/lib/react-qw/props.ts +5 -4
  54. package/lib/react-qw/reconciler.js +10 -10
  55. package/lib/react-qw/reconciler.ts +11 -10
  56. package/lib/text-measure.js +3 -3
  57. package/lib/text-measure.ts +4 -3
  58. package/lib/websocket.js +17 -17
  59. package/lib/websocket.ts +18 -17
  60. package/lib/windows/advapi32.js +7 -7
  61. package/lib/windows/advapi32.ts +7 -7
  62. package/lib/windows/gdi32.js +16 -16
  63. package/lib/windows/gdi32.ts +16 -16
  64. package/lib/windows/kernel32.js +41 -2
  65. package/lib/windows/kernel32.ts +45 -2
  66. package/lib/windows/shell32.js +24 -3
  67. package/lib/windows/shell32.ts +27 -4
  68. package/lib/windows/structs.js +54 -0
  69. package/lib/windows/structs.ts +63 -1
  70. package/lib/windows/user32.js +18 -6
  71. package/lib/windows/user32.ts +18 -6
  72. package/lib/windows/winspool.js +3 -3
  73. package/lib/windows/winspool.ts +3 -3
  74. package/package.json +4 -3
  75. package/quickwin.d.ts +32 -10
  76. package/qwin-nowasm-x86.exe +0 -0
  77. package/qwin-nowasm.exe +0 -0
  78. package/qwin-x86.exe +0 -0
  79. package/qwin.exe +0 -0
  80. package/test/test_ffi_bind.js +7 -7
  81. package/test/test_ffi_bind.ts +8 -8
  82. package/test/test_ffi_struct.js +2 -2
  83. package/test/test_ffi_struct.ts +3 -3
  84. package/test/test_ffi_windows.js +1 -1
  85. package/test/test_ffi_windows.ts +1 -1
  86. package/test/test_files.js +7 -7
  87. package/test/test_files.ts +8 -8
  88. package/test/test_gdi_draw.js +51 -51
  89. package/test/test_gdi_draw.ts +57 -57
  90. package/test/test_http_server.js +3 -3
  91. package/test/test_http_server.ts +4 -3
  92. package/test/test_ipv6.js +3 -3
  93. package/test/test_ipv6.ts +4 -3
  94. package/test/test_net_event.js +3 -3
  95. package/test/test_net_event.ts +4 -3
  96. package/test/test_printer.js +4 -4
  97. package/test/test_printer.ts +5 -5
  98. package/test/test_react_complex.js +36 -21
  99. package/test/test_react_counter.js +34 -19
  100. package/test/test_react_flex.js +36 -21
  101. package/test/test_react_hidden.js +34 -19
  102. package/test/test_react_listview_link.js +35 -20
  103. package/test/test_react_notify.js +52 -37
  104. package/test/test_react_render.js +34 -19
  105. package/test/test_registry.js +6 -6
  106. package/test/test_registry.ts +8 -8
  107. package/test/test_wolfssl_read.js +8 -8
  108. package/test/test_wolfssl_read.ts +9 -8
  109. package/examples/execd.tsx +0 -798
  110. package/examples/execd_worker.ts +0 -127
  111. package/quickwin_const.d.ts +0 -1063
@@ -16562,6 +16562,14 @@ var LVCOLUMNW_DECL = {
16562
16562
  cxIdeal: "i32"
16563
16563
  };
16564
16564
  var LVCOLUMNW = /* @__PURE__ */ struct("LVCOLUMNW", LVCOLUMNW_DECL);
16565
+ var NOTIFYICONIDENTIFIER_DECL = {
16566
+ "#": "struct",
16567
+ cbSize: "u32",
16568
+ hWnd: "<HWND>ptr",
16569
+ uID: "u32",
16570
+ guidItem: "u32[4]"
16571
+ };
16572
+ var NOTIFYICONIDENTIFIER = /* @__PURE__ */ struct("NOTIFYICONIDENTIFIER", NOTIFYICONIDENTIFIER_DECL);
16565
16573
 
16566
16574
  // _build/lib/windows/user32.js
16567
16575
  var b = (name, sig, encoders) => bind("user32.dll", name, sig, encoders);
@@ -16631,14 +16639,14 @@ function applyProps(instance, newProps, _oldProps) {
16631
16639
  gui.ShowWindow(
16632
16640
  hwnd,
16633
16641
  newProps.hidden ? 0 : 5
16634
- /* gui.ShowWindowCmd.SHOW */
16642
+ /* ShowWindowCmd.SHOW */
16635
16643
  );
16636
16644
  }
16637
16645
  if ("visible" in newProps) {
16638
16646
  gui.ShowWindow(
16639
16647
  hwnd,
16640
16648
  newProps.visible ? 5 : 0
16641
- /* gui.ShowWindowCmd.HIDE */
16649
+ /* ShowWindowCmd.HIDE */
16642
16650
  );
16643
16651
  }
16644
16652
  }
@@ -16734,7 +16742,7 @@ function measureText(hdc, text, maxWidth) {
16734
16742
  -1,
16735
16743
  r.ptr,
16736
16744
  1024
16737
- /* gui.DrawTextFlag.CALCRECT */
16745
+ /* DrawTextFlag.CALCRECT */
16738
16746
  );
16739
16747
  const { right, bottom } = RECT.decode(r);
16740
16748
  return { width: right, height: bottom };
@@ -16782,7 +16790,7 @@ function setupWindowProc(instance, hwnd) {
16782
16790
  const oldProc = GetWindowLongPtr(
16783
16791
  hwnd,
16784
16792
  -4
16785
- /* gui.Gwlp.WNDPROC */
16793
+ /* Gwlp.WNDPROC */
16786
16794
  );
16787
16795
  instancesByHwnd.set(hwnd, instance);
16788
16796
  gui3.SetWindowProc(hwnd, (hwnd2, msg, wParam, lParam) => {
@@ -16870,7 +16878,7 @@ function runFlexLayout(inst) {
16870
16878
  r.width * scaleFactor,
16871
16879
  r.height * scaleFactor,
16872
16880
  64
16873
- /* gui.SetWindowPosFlag.SWP_SHOWWINDOW */
16881
+ /* SetWindowPosFlag.SWP_SHOWWINDOW */
16874
16882
  );
16875
16883
  InvalidateRect(child2.hwnd, NULL, 1);
16876
16884
  child2.lastRect = { x: r.x, y: r.y, w: r.width, h: r.height };
@@ -17026,7 +17034,7 @@ var hostConfig = {
17026
17034
  gui3.ShowWindow(
17027
17035
  instance.hwnd,
17028
17036
  0
17029
- /* gui.ShowWindowCmd.HIDE */
17037
+ /* ShowWindowCmd.HIDE */
17030
17038
  );
17031
17039
  },
17032
17040
  hideTextInstance(instance) {
@@ -17034,7 +17042,7 @@ var hostConfig = {
17034
17042
  gui3.ShowWindow(
17035
17043
  instance.hwnd,
17036
17044
  0
17037
- /* gui.ShowWindowCmd.HIDE */
17045
+ /* ShowWindowCmd.HIDE */
17038
17046
  );
17039
17047
  },
17040
17048
  unhideInstance(instance, _props) {
@@ -17042,7 +17050,7 @@ var hostConfig = {
17042
17050
  gui3.ShowWindow(
17043
17051
  instance.hwnd,
17044
17052
  5
17045
- /* gui.ShowWindowCmd.SHOW */
17053
+ /* ShowWindowCmd.SHOW */
17046
17054
  );
17047
17055
  },
17048
17056
  unhideTextInstance(instance, _text) {
@@ -17050,7 +17058,7 @@ var hostConfig = {
17050
17058
  gui3.ShowWindow(
17051
17059
  instance.hwnd,
17052
17060
  5
17053
- /* gui.ShowWindowCmd.SHOW */
17061
+ /* ShowWindowCmd.SHOW */
17054
17062
  );
17055
17063
  },
17056
17064
  shouldSetTextContent(_type, props) {
@@ -17478,7 +17486,7 @@ function getCellFont(hwnd, style) {
17478
17486
  ...base,
17479
17487
  ...style.bold ? {
17480
17488
  lfWeight: 700
17481
- /* gui.FontWeight.BOLD */
17489
+ /* FontWeight.BOLD */
17482
17490
  } : {},
17483
17491
  ...style.italic ? { lfItalic: 1 } : {},
17484
17492
  ...style.underline ? { lfUnderline: 1 } : {}
@@ -17600,7 +17608,7 @@ var ListView = (0, import_react9.forwardRef)(function ListViewInner({ columns: c
17600
17608
  4150,
17601
17609
  0,
17602
17610
  32 | 1 | 65536
17603
- /* gui.LvExStyle.DOUBLEBUFFER */
17611
+ /* LvExStyle.DOUBLEBUFFER */
17604
17612
  );
17605
17613
  const n = columns2.length;
17606
17614
  for (let j = 0; j < n; j++) {
@@ -17645,7 +17653,7 @@ var ListView = (0, import_react9.forwardRef)(function ListViewInner({ columns: c
17645
17653
  4126,
17646
17654
  j,
17647
17655
  -2
17648
- /* gui.LvColumnWidthCmd.AUTOSIZE_USEHEADER */
17656
+ /* LvColumnWidthCmd.AUTOSIZE_USEHEADER */
17649
17657
  );
17650
17658
  }
17651
17659
  }
@@ -17787,7 +17795,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17787
17795
  natW,
17788
17796
  natH,
17789
17797
  4
17790
- /* gui.SetWindowPosFlag.SWP_NOZORDER */
17798
+ /* SetWindowPosFlag.SWP_NOZORDER */
17791
17799
  );
17792
17800
  forceFlexLayout(content);
17793
17801
  if (natW > svW) {
@@ -17826,7 +17834,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17826
17834
  0,
17827
17835
  0,
17828
17836
  1 | 4
17829
- /* gui.SetWindowPosFlag.SWP_NOZORDER */
17837
+ /* SetWindowPosFlag.SWP_NOZORDER */
17830
17838
  );
17831
17839
  gui12.SetScrollInfo(sv, bar, { pos: newPos }, true);
17832
17840
  }
@@ -17892,7 +17900,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17892
17900
  handleScroll(
17893
17901
  e,
17894
17902
  1
17895
- /* gui.ScrollBar.VERT */
17903
+ /* ScrollBar.VERT */
17896
17904
  );
17897
17905
  return 0;
17898
17906
  }
@@ -17900,7 +17908,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17900
17908
  handleScroll(
17901
17909
  e,
17902
17910
  0
17903
- /* gui.ScrollBar.HORZ */
17911
+ /* ScrollBar.HORZ */
17904
17912
  );
17905
17913
  return 0;
17906
17914
  }
@@ -18064,7 +18072,7 @@ function deleteAllItems(hTree) {
18064
18072
  4353,
18065
18073
  1,
18066
18074
  -65536
18067
- /* gui.TvInsertAfter.ROOT */
18075
+ /* TvInsertAfter.ROOT */
18068
18076
  );
18069
18077
  }
18070
18078
  var TreeView = (0, import_react16.forwardRef)(function TreeViewInner({ data: data2, onSelect, defaultSelectedKey, selectedKey: controlledKey, style }, ref) {
@@ -18096,7 +18104,7 @@ var TreeView = (0, import_react16.forwardRef)(function TreeViewInner({ data: dat
18096
18104
  4396,
18097
18105
  0,
18098
18106
  4
18099
- /* gui.TvExStyle.DOUBLEBUFFER */
18107
+ /* TvExStyle.DOUBLEBUFFER */
18100
18108
  );
18101
18109
  }, []);
18102
18110
  (0, import_react16.useEffect)(() => {
@@ -18138,9 +18146,16 @@ var b3 = (name, sig) => bind("comdlg32.dll", name, sig);
18138
18146
  var GetOpenFileName = /* @__PURE__ */ b3("GetOpenFileNameW", "<OPENFILENAMEW>ptr -> u32");
18139
18147
 
18140
18148
  // _build/lib/windows/shell32.js
18141
- var b4 = (name, sig) => bind("shell32.dll", name, sig);
18149
+ var b4 = (name, sig, encoders) => bind("shell32.dll", name, sig, encoders);
18142
18150
  var SHBrowseForFolder = /* @__PURE__ */ b4("SHBrowseForFolderW", "<BROWSEINFOW>ptr -> <>ptr");
18143
18151
  var SHGetPathFromIDList = /* @__PURE__ */ b4("SHGetPathFromIDListW", "<>ptr <BYTE>ptr -> u32");
18152
+ var Shell_NotifyIconGetRect = (() => {
18153
+ try {
18154
+ return b4("Shell_NotifyIconGetRect", "<NOTIFYICONIDENTIFIER>ptr <RECT>ptr -> i32", { NOTIFYICONIDENTIFIER });
18155
+ } catch {
18156
+ return null;
18157
+ }
18158
+ })();
18144
18159
 
18145
18160
  // _build/lib/windows/ole32.js
18146
18161
  var b5 = (name, sig) => bind("ole32.dll", name, sig);
@@ -18392,7 +18407,7 @@ function runAll() {
18392
18407
  const lvNM = (code) => nm(HDR + 128, code);
18393
18408
  let m = lvNM(
18394
18409
  -2
18395
- /* gui.LvNotifyCode.CLICK */
18410
+ /* LvNotifyCode.CLICK */
18396
18411
  );
18397
18412
  m.dv.setInt32(HDR, 1, true);
18398
18413
  m.dv.setInt32(HDR + 4, 2, true);
@@ -18400,7 +18415,7 @@ function runAll() {
18400
18415
  expect("LV click(item=1,sub=2) \u89E6\u53D1 onCellClick", lvClicks.slice(), ["b@1"]);
18401
18416
  m = lvNM(
18402
18417
  -2
18403
- /* gui.LvNotifyCode.CLICK */
18418
+ /* LvNotifyCode.CLICK */
18404
18419
  );
18405
18420
  m.dv.setInt32(HDR, 0, true);
18406
18421
  m.dv.setInt32(HDR + 4, 0, true);
@@ -18408,7 +18423,7 @@ function runAll() {
18408
18423
  expect("LV click(sub=0, \u8BE5\u5217\u65E0 onCellClick) \u4E0D\u89E6\u53D1", lvClicks.slice(), ["b@1"]);
18409
18424
  m = lvNM(
18410
18425
  -2
18411
- /* gui.LvNotifyCode.CLICK */
18426
+ /* LvNotifyCode.CLICK */
18412
18427
  );
18413
18428
  m.dv.setInt32(HDR, 9, true);
18414
18429
  m.dv.setInt32(HDR + 4, 2, true);
@@ -18416,7 +18431,7 @@ function runAll() {
18416
18431
  expect("LV click(item \u8D8A\u754C) \u4E0D\u89E6\u53D1", lvClicks.slice(), ["b@1"]);
18417
18432
  m = lvNM(
18418
18433
  -2
18419
- /* gui.LvNotifyCode.CLICK */
18434
+ /* LvNotifyCode.CLICK */
18420
18435
  );
18421
18436
  m.dv.setInt32(HDR, 2, true);
18422
18437
  m.dv.setInt32(HDR + 4, 2, true);
@@ -18425,21 +18440,21 @@ function runAll() {
18425
18440
  const SEL = 2;
18426
18441
  m = lvNM(
18427
18442
  -100
18428
- /* gui.LvNotifyCode.ITEMCHANGING */
18443
+ /* LvNotifyCode.ITEMCHANGING */
18429
18444
  );
18430
18445
  m.dv.setUint32(HDR + 8, SEL, true);
18431
18446
  m.dv.setUint32(HDR + 12, 0, true);
18432
18447
  expect("LV ITEMCHANGING \u9009\u4E2D\u4F4D\u53D8\u5316 \u2192 \u62E6\u622A(1)", notify(lvW, m.b), 1);
18433
18448
  m = lvNM(
18434
18449
  -100
18435
- /* gui.LvNotifyCode.ITEMCHANGING */
18450
+ /* LvNotifyCode.ITEMCHANGING */
18436
18451
  );
18437
18452
  m.dv.setUint32(HDR + 8, 1, true);
18438
18453
  m.dv.setUint32(HDR + 12, 0, true);
18439
18454
  expect("LV ITEMCHANGING \u9009\u4E2D\u4F4D\u4E0D\u53D8 \u2192 \u653E\u884C(0)", notify(lvW, m.b), 0);
18440
18455
  m = lvNM(
18441
18456
  -100
18442
- /* gui.LvNotifyCode.ITEMCHANGING */
18457
+ /* LvNotifyCode.ITEMCHANGING */
18443
18458
  );
18444
18459
  m.dv.setUint32(HDR + 8, 2147483648 | SEL, true);
18445
18460
  m.dv.setUint32(HDR + 12, 2147483648, true);
@@ -18452,7 +18467,7 @@ function runAll() {
18452
18467
  const x = nm(
18453
18468
  cdEnd + 64,
18454
18469
  -12
18455
- /* gui.LvNotifyCode.CUSTOMDRAW */
18470
+ /* LvNotifyCode.CUSTOMDRAW */
18456
18471
  );
18457
18472
  x.dv.setUint32(cdStage, stage, true);
18458
18473
  setPtr(x.dv, cdHdc, memDc);
@@ -18464,26 +18479,26 @@ function runAll() {
18464
18479
  "LV CUSTOMDRAW PREPAINT \u2192 NOTIFYITEMDRAW",
18465
18480
  notify(lvW, cd(1, 0, 0).b),
18466
18481
  32
18467
- /* gui.CustomDrawFlag.NOTIFYITEMDRAW */
18482
+ /* CustomDrawFlag.NOTIFYITEMDRAW */
18468
18483
  );
18469
18484
  expect(
18470
18485
  "LV CUSTOMDRAW ITEMPREPAINT \u2192 NOTIFYSUBITEMDRAW",
18471
18486
  notify(lvW, cd(65537, 0, 0).b),
18472
18487
  32
18473
- /* gui.CustomDrawFlag.NOTIFYSUBITEMDRAW */
18488
+ /* CustomDrawFlag.NOTIFYSUBITEMDRAW */
18474
18489
  );
18475
18490
  expect(
18476
18491
  "LV CUSTOMDRAW SUBITEMPREPAINT(\u65E0\u6837\u5F0F\u5217) \u2192 DODEFAULT",
18477
18492
  notify(lvW, cd(196609, 1, 0).b),
18478
18493
  0
18479
- /* gui.CustomDrawFlag.DODEFAULT */
18494
+ /* CustomDrawFlag.DODEFAULT */
18480
18495
  );
18481
18496
  const sub = cd(196609, 1, 2);
18482
18497
  expect(
18483
18498
  "LV CUSTOMDRAW SUBITEMPREPAINT(\u6837\u5F0F\u5217, \u5E26\u5B57\u4F53) \u2192 NEWFONT",
18484
18499
  notify(lvW, sub.b),
18485
18500
  2
18486
- /* gui.CustomDrawFlag.NEWFONT */
18501
+ /* CustomDrawFlag.NEWFONT */
18487
18502
  );
18488
18503
  expect("LV CUSTOMDRAW \u5199\u56DE clrText", sub.dv.getUint32(lvText, true), 16711680);
18489
18504
  expect("LV CUSTOMDRAW \u5199\u56DE clrTextBk", sub.dv.getUint32(lvBk, true), 1122867);
@@ -18498,18 +18513,18 @@ function runAll() {
18498
18513
  };
18499
18514
  notify(linkW, lk(
18500
18515
  -2
18501
- /* gui.SysLinkNotifyCode.CLICK */
18516
+ /* SysLinkNotifyCode.CLICK */
18502
18517
  ).b);
18503
18518
  notify(linkW, lk(
18504
18519
  -4
18505
- /* gui.SysLinkNotifyCode.RETURN */
18520
+ /* SysLinkNotifyCode.RETURN */
18506
18521
  ).b);
18507
18522
  expect("Link CLICK/RETURN \u2192 onClick(url)", linkUrls.slice(), [URL, URL]);
18508
18523
  const dt = (flags) => {
18509
18524
  const x = nm(
18510
18525
  HDR + 4 + 16 + 8,
18511
18526
  -759
18512
- /* gui.DtNotifyCode.DATETIMECHANGE */
18527
+ /* DtNotifyCode.DATETIMECHANGE */
18513
18528
  );
18514
18529
  x.dv.setUint32(HDR, flags, true);
18515
18530
  const s = HDR + 4;
@@ -18525,11 +18540,11 @@ function runAll() {
18525
18540
  };
18526
18541
  notify(dtpW, dt(
18527
18542
  0
18528
- /* gui.DtFlag.GDT_VALID */
18543
+ /* DtFlag.GDT_VALID */
18529
18544
  ).b);
18530
18545
  notify(dtpW, dt(
18531
18546
  1
18532
- /* gui.DtFlag.GDT_NONE */
18547
+ /* DtFlag.GDT_NONE */
18533
18548
  ).b);
18534
18549
  expect("DTP DATETIMECHANGE \u2192 onChange(Date | null)", dtpVals.slice(), [new Date(2024, 1, 29, 13, 45, 59).getTime(), null]);
18535
18550
  const back = new ArrayBuffer(16);
@@ -18549,7 +18564,7 @@ function runAll() {
18549
18564
  notify(tabW, nm(
18550
18565
  HDR + 8,
18551
18566
  -552
18552
- /* gui.TcNotifyCode.SELCHANGING */
18567
+ /* TcNotifyCode.SELCHANGING */
18553
18568
  ).b);
18554
18569
  expect("Tab SELCHANGING \u2192 onChange(1)", tabSel.slice(), [1]);
18555
18570
  const tv = child(tvW);
@@ -16560,6 +16560,14 @@ var LVCOLUMNW_DECL = {
16560
16560
  cxIdeal: "i32"
16561
16561
  };
16562
16562
  var LVCOLUMNW = /* @__PURE__ */ struct("LVCOLUMNW", LVCOLUMNW_DECL);
16563
+ var NOTIFYICONIDENTIFIER_DECL = {
16564
+ "#": "struct",
16565
+ cbSize: "u32",
16566
+ hWnd: "<HWND>ptr",
16567
+ uID: "u32",
16568
+ guidItem: "u32[4]"
16569
+ };
16570
+ var NOTIFYICONIDENTIFIER = /* @__PURE__ */ struct("NOTIFYICONIDENTIFIER", NOTIFYICONIDENTIFIER_DECL);
16563
16571
 
16564
16572
  // _build/lib/windows/user32.js
16565
16573
  var b = (name, sig, encoders) => bind("user32.dll", name, sig, encoders);
@@ -16625,14 +16633,14 @@ function applyProps(instance, newProps, _oldProps) {
16625
16633
  gui.ShowWindow(
16626
16634
  hwnd2,
16627
16635
  newProps.hidden ? 0 : 5
16628
- /* gui.ShowWindowCmd.SHOW */
16636
+ /* ShowWindowCmd.SHOW */
16629
16637
  );
16630
16638
  }
16631
16639
  if ("visible" in newProps) {
16632
16640
  gui.ShowWindow(
16633
16641
  hwnd2,
16634
16642
  newProps.visible ? 5 : 0
16635
- /* gui.ShowWindowCmd.HIDE */
16643
+ /* ShowWindowCmd.HIDE */
16636
16644
  );
16637
16645
  }
16638
16646
  }
@@ -16728,7 +16736,7 @@ function measureText(hdc, text, maxWidth) {
16728
16736
  -1,
16729
16737
  r.ptr,
16730
16738
  1024
16731
- /* gui.DrawTextFlag.CALCRECT */
16739
+ /* DrawTextFlag.CALCRECT */
16732
16740
  );
16733
16741
  const { right, bottom } = RECT.decode(r);
16734
16742
  return { width: right, height: bottom };
@@ -16776,7 +16784,7 @@ function setupWindowProc(instance, hwnd2) {
16776
16784
  const oldProc = GetWindowLongPtr(
16777
16785
  hwnd2,
16778
16786
  -4
16779
- /* gui.Gwlp.WNDPROC */
16787
+ /* Gwlp.WNDPROC */
16780
16788
  );
16781
16789
  instancesByHwnd.set(hwnd2, instance);
16782
16790
  gui3.SetWindowProc(hwnd2, (hwnd3, msg, wParam, lParam) => {
@@ -16864,7 +16872,7 @@ function runFlexLayout(inst) {
16864
16872
  r.width * scaleFactor,
16865
16873
  r.height * scaleFactor,
16866
16874
  64
16867
- /* gui.SetWindowPosFlag.SWP_SHOWWINDOW */
16875
+ /* SetWindowPosFlag.SWP_SHOWWINDOW */
16868
16876
  );
16869
16877
  InvalidateRect(child.hwnd, NULL, 1);
16870
16878
  child.lastRect = { x: r.x, y: r.y, w: r.width, h: r.height };
@@ -17020,7 +17028,7 @@ var hostConfig = {
17020
17028
  gui3.ShowWindow(
17021
17029
  instance.hwnd,
17022
17030
  0
17023
- /* gui.ShowWindowCmd.HIDE */
17031
+ /* ShowWindowCmd.HIDE */
17024
17032
  );
17025
17033
  },
17026
17034
  hideTextInstance(instance) {
@@ -17028,7 +17036,7 @@ var hostConfig = {
17028
17036
  gui3.ShowWindow(
17029
17037
  instance.hwnd,
17030
17038
  0
17031
- /* gui.ShowWindowCmd.HIDE */
17039
+ /* ShowWindowCmd.HIDE */
17032
17040
  );
17033
17041
  },
17034
17042
  unhideInstance(instance, _props) {
@@ -17036,7 +17044,7 @@ var hostConfig = {
17036
17044
  gui3.ShowWindow(
17037
17045
  instance.hwnd,
17038
17046
  5
17039
- /* gui.ShowWindowCmd.SHOW */
17047
+ /* ShowWindowCmd.SHOW */
17040
17048
  );
17041
17049
  },
17042
17050
  unhideTextInstance(instance, _text) {
@@ -17044,7 +17052,7 @@ var hostConfig = {
17044
17052
  gui3.ShowWindow(
17045
17053
  instance.hwnd,
17046
17054
  5
17047
- /* gui.ShowWindowCmd.SHOW */
17055
+ /* ShowWindowCmd.SHOW */
17048
17056
  );
17049
17057
  },
17050
17058
  shouldSetTextContent(_type, props) {
@@ -17472,7 +17480,7 @@ function getCellFont(hwnd2, style) {
17472
17480
  ...base,
17473
17481
  ...style.bold ? {
17474
17482
  lfWeight: 700
17475
- /* gui.FontWeight.BOLD */
17483
+ /* FontWeight.BOLD */
17476
17484
  } : {},
17477
17485
  ...style.italic ? { lfItalic: 1 } : {},
17478
17486
  ...style.underline ? { lfUnderline: 1 } : {}
@@ -17594,7 +17602,7 @@ var ListView = (0, import_react9.forwardRef)(function ListViewInner({ columns, d
17594
17602
  4150,
17595
17603
  0,
17596
17604
  32 | 1 | 65536
17597
- /* gui.LvExStyle.DOUBLEBUFFER */
17605
+ /* LvExStyle.DOUBLEBUFFER */
17598
17606
  );
17599
17607
  const n = columns.length;
17600
17608
  for (let j = 0; j < n; j++) {
@@ -17639,7 +17647,7 @@ var ListView = (0, import_react9.forwardRef)(function ListViewInner({ columns, d
17639
17647
  4126,
17640
17648
  j,
17641
17649
  -2
17642
- /* gui.LvColumnWidthCmd.AUTOSIZE_USEHEADER */
17650
+ /* LvColumnWidthCmd.AUTOSIZE_USEHEADER */
17643
17651
  );
17644
17652
  }
17645
17653
  }
@@ -17781,7 +17789,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17781
17789
  natW,
17782
17790
  natH,
17783
17791
  4
17784
- /* gui.SetWindowPosFlag.SWP_NOZORDER */
17792
+ /* SetWindowPosFlag.SWP_NOZORDER */
17785
17793
  );
17786
17794
  forceFlexLayout(content);
17787
17795
  if (natW > svW) {
@@ -17820,7 +17828,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17820
17828
  0,
17821
17829
  0,
17822
17830
  1 | 4
17823
- /* gui.SetWindowPosFlag.SWP_NOZORDER */
17831
+ /* SetWindowPosFlag.SWP_NOZORDER */
17824
17832
  );
17825
17833
  gui12.SetScrollInfo(sv, bar, { pos: newPos }, true);
17826
17834
  }
@@ -17886,7 +17894,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17886
17894
  handleScroll(
17887
17895
  e,
17888
17896
  1
17889
- /* gui.ScrollBar.VERT */
17897
+ /* ScrollBar.VERT */
17890
17898
  );
17891
17899
  return 0;
17892
17900
  }
@@ -17894,7 +17902,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17894
17902
  handleScroll(
17895
17903
  e,
17896
17904
  0
17897
- /* gui.ScrollBar.HORZ */
17905
+ /* ScrollBar.HORZ */
17898
17906
  );
17899
17907
  return 0;
17900
17908
  }
@@ -18058,7 +18066,7 @@ function deleteAllItems(hTree) {
18058
18066
  4353,
18059
18067
  1,
18060
18068
  -65536
18061
- /* gui.TvInsertAfter.ROOT */
18069
+ /* TvInsertAfter.ROOT */
18062
18070
  );
18063
18071
  }
18064
18072
  var TreeView = (0, import_react16.forwardRef)(function TreeViewInner({ data, onSelect, defaultSelectedKey, selectedKey: controlledKey, style }, ref) {
@@ -18090,7 +18098,7 @@ var TreeView = (0, import_react16.forwardRef)(function TreeViewInner({ data, onS
18090
18098
  4396,
18091
18099
  0,
18092
18100
  4
18093
- /* gui.TvExStyle.DOUBLEBUFFER */
18101
+ /* TvExStyle.DOUBLEBUFFER */
18094
18102
  );
18095
18103
  }, []);
18096
18104
  (0, import_react16.useEffect)(() => {
@@ -18132,9 +18140,16 @@ var b3 = (name, sig) => bind("comdlg32.dll", name, sig);
18132
18140
  var GetOpenFileName = /* @__PURE__ */ b3("GetOpenFileNameW", "<OPENFILENAMEW>ptr -> u32");
18133
18141
 
18134
18142
  // _build/lib/windows/shell32.js
18135
- var b4 = (name, sig) => bind("shell32.dll", name, sig);
18143
+ var b4 = (name, sig, encoders) => bind("shell32.dll", name, sig, encoders);
18136
18144
  var SHBrowseForFolder = /* @__PURE__ */ b4("SHBrowseForFolderW", "<BROWSEINFOW>ptr -> <>ptr");
18137
18145
  var SHGetPathFromIDList = /* @__PURE__ */ b4("SHGetPathFromIDListW", "<>ptr <BYTE>ptr -> u32");
18146
+ var Shell_NotifyIconGetRect = (() => {
18147
+ try {
18148
+ return b4("Shell_NotifyIconGetRect", "<NOTIFYICONIDENTIFIER>ptr <RECT>ptr -> i32", { NOTIFYICONIDENTIFIER });
18149
+ } catch {
18150
+ return null;
18151
+ }
18152
+ })();
18138
18153
 
18139
18154
  // _build/lib/windows/ole32.js
18140
18155
  var b5 = (name, sig) => bind("ole32.dll", name, sig);
@@ -38,7 +38,7 @@ export const suite = {
38
38
  const phk = new PtrArrayBuffer(8);
39
39
  // hKey 位双来源:预定义键常量(HKEY_CURRENT_USER = 0x80000001 的 i32 形)
40
40
  // 或真实句柄——裸 <>ptr 位收两者;符号/零扩展语义由本调用实测检验
41
- const rcCreate = RegCreateKeyEx(-2147483647 /* gui.HKey.CURRENT_USER */, KEY, 0, NULL, 0, 983103 /* gui.RegAccess.ALL_ACCESS */, NULL, phk, NULL);
41
+ const rcCreate = RegCreateKeyEx(-2147483647 /* HKey.CURRENT_USER */, KEY, 0, NULL, 0, 983103 /* RegAccess.ALL_ACCESS */, NULL, phk, NULL);
42
42
  t.check('create key = ERROR_SUCCESS', 0, rcCreate);
43
43
  if (rcCreate !== 0)
44
44
  return; // 基座失败,后续无意义
@@ -46,7 +46,7 @@ export const suite = {
46
46
  t.checkTrue(`key handle non-null (${hkey})`, hkey !== 0);
47
47
  t.section('RegSetValueEx + RegQueryValueEx: REG_SZ roundtrip');
48
48
  const data = wbuf(MSG);
49
- t.check('set REG_SZ = ERROR_SUCCESS', 0, RegSetValueEx(hkey, 'greeting', 0, 1 /* gui.RegType.SZ */, data, (MSG.length + 1) * 2));
49
+ t.check('set REG_SZ = ERROR_SUCCESS', 0, RegSetValueEx(hkey, 'greeting', 0, 1 /* RegType.SZ */, data, (MSG.length + 1) * 2));
50
50
  const pType = new PtrArrayBuffer(4);
51
51
  const pCb = new PtrArrayBuffer(4);
52
52
  const pData = new PtrArrayBuffer(64);
@@ -61,14 +61,14 @@ export const suite = {
61
61
  t.check('probe size', (MSG.length + 1) * 2, new DataView(pCb).getUint32(0, true));
62
62
  t.section('RegOpenKeyEx: reopen + missings');
63
63
  const phk2 = new PtrArrayBuffer(8);
64
- t.check('reopen = ERROR_SUCCESS', 0, RegOpenKeyEx(-2147483647 /* gui.HKey.CURRENT_USER */, KEY, 0, 131097 /* gui.RegAccess.READ */, phk2));
64
+ t.check('reopen = ERROR_SUCCESS', 0, RegOpenKeyEx(-2147483647 /* HKey.CURRENT_USER */, KEY, 0, 131097 /* RegAccess.READ */, phk2));
65
65
  const hkey2 = readPtr(new DataView(phk2), 0);
66
66
  t.check('missing value → ERROR_FILE_NOT_FOUND', 2, RegQueryValueEx(hkey2, 'no-such-value', NULL, NULL, NULL, NULL));
67
- t.check('missing key → ERROR_FILE_NOT_FOUND', 2, RegOpenKeyEx(-2147483647 /* gui.HKey.CURRENT_USER */, KEY + 'X', 0, 131097 /* gui.RegAccess.READ */, new PtrArrayBuffer(8)));
67
+ t.check('missing key → ERROR_FILE_NOT_FOUND', 2, RegOpenKeyEx(-2147483647 /* HKey.CURRENT_USER */, KEY + 'X', 0, 131097 /* RegAccess.READ */, new PtrArrayBuffer(8)));
68
68
  RegCloseKey(hkey2);
69
69
  t.section('RegDeleteKey + RegCloseKey: cleanup');
70
- t.check('delete key = ERROR_SUCCESS', 0, RegDeleteKey(-2147483647 /* gui.HKey.CURRENT_USER */, KEY));
70
+ t.check('delete key = ERROR_SUCCESS', 0, RegDeleteKey(-2147483647 /* HKey.CURRENT_USER */, KEY));
71
71
  t.check('close = ERROR_SUCCESS', 0, RegCloseKey(hkey));
72
- t.check('open deleted → ERROR_FILE_NOT_FOUND', 2, RegOpenKeyEx(-2147483647 /* gui.HKey.CURRENT_USER */, KEY, 0, 131097 /* gui.RegAccess.READ */, new PtrArrayBuffer(8)));
72
+ t.check('open deleted → ERROR_FILE_NOT_FOUND', 2, RegOpenKeyEx(-2147483647 /* HKey.CURRENT_USER */, KEY, 0, 131097 /* RegAccess.READ */, new PtrArrayBuffer(8)));
73
73
  },
74
74
  };
@@ -1,11 +1,11 @@
1
1
  import * as os from 'os'
2
- import * as gui from 'gui'
3
2
  import { NULL, PtrArrayBuffer } from '../lib/ffi/ctype.js'
4
3
  import {
5
4
  RegCloseKey, RegCreateKeyEx, RegDeleteKey, RegOpenKeyEx,
6
5
  RegQueryValueEx, RegSetValueEx,
7
6
  } from '../lib/windows/advapi32.js'
8
7
  import { Tester } from './test_helper.js'
8
+ import { HKey, RegAccess, RegType } from '../constants'
9
9
 
10
10
  // 跨架构读指针宽句柄(ia32 4B / x64 8B)—— 照 test_ffi.ts 的 readPtr 先例
11
11
  function readPtr(dv: DataView, offset: number): number {
@@ -45,8 +45,8 @@ export const suite = {
45
45
  const phk = new PtrArrayBuffer(8)
46
46
  // hKey 位双来源:预定义键常量(HKEY_CURRENT_USER = 0x80000001 的 i32 形)
47
47
  // 或真实句柄——裸 <>ptr 位收两者;符号/零扩展语义由本调用实测检验
48
- const rcCreate = RegCreateKeyEx(gui.HKey.CURRENT_USER, KEY, 0, NULL, 0,
49
- gui.RegAccess.ALL_ACCESS, NULL, phk, NULL)
48
+ const rcCreate = RegCreateKeyEx(HKey.CURRENT_USER, KEY, 0, NULL, 0,
49
+ RegAccess.ALL_ACCESS, NULL, phk, NULL)
50
50
  t.check('create key = ERROR_SUCCESS', 0, rcCreate)
51
51
  if (rcCreate !== 0) return // 基座失败,后续无意义
52
52
  const hkey = readPtr(new DataView(phk), 0)
@@ -55,7 +55,7 @@ export const suite = {
55
55
  t.section('RegSetValueEx + RegQueryValueEx: REG_SZ roundtrip')
56
56
  const data = wbuf(MSG)
57
57
  t.check('set REG_SZ = ERROR_SUCCESS', 0,
58
- RegSetValueEx(hkey, 'greeting', 0, gui.RegType.SZ, data, (MSG.length + 1) * 2))
58
+ RegSetValueEx(hkey, 'greeting', 0, RegType.SZ, data, (MSG.length + 1) * 2))
59
59
  const pType = new PtrArrayBuffer(4)
60
60
  const pCb = new PtrArrayBuffer(4)
61
61
  const pData = new PtrArrayBuffer(64)
@@ -75,21 +75,21 @@ export const suite = {
75
75
  t.section('RegOpenKeyEx: reopen + missings')
76
76
  const phk2 = new PtrArrayBuffer(8)
77
77
  t.check('reopen = ERROR_SUCCESS', 0,
78
- RegOpenKeyEx(gui.HKey.CURRENT_USER, KEY, 0, gui.RegAccess.READ, phk2))
78
+ RegOpenKeyEx(HKey.CURRENT_USER, KEY, 0, RegAccess.READ, phk2))
79
79
  const hkey2 = readPtr(new DataView(phk2), 0)
80
80
  t.check('missing value → ERROR_FILE_NOT_FOUND', 2,
81
81
  RegQueryValueEx(hkey2, 'no-such-value', NULL, NULL, NULL, NULL))
82
82
  t.check('missing key → ERROR_FILE_NOT_FOUND', 2,
83
- RegOpenKeyEx(gui.HKey.CURRENT_USER, KEY + 'X', 0, gui.RegAccess.READ,
83
+ RegOpenKeyEx(HKey.CURRENT_USER, KEY + 'X', 0, RegAccess.READ,
84
84
  new PtrArrayBuffer(8)))
85
85
  RegCloseKey(hkey2)
86
86
 
87
87
  t.section('RegDeleteKey + RegCloseKey: cleanup')
88
88
  t.check('delete key = ERROR_SUCCESS', 0,
89
- RegDeleteKey(gui.HKey.CURRENT_USER, KEY))
89
+ RegDeleteKey(HKey.CURRENT_USER, KEY))
90
90
  t.check('close = ERROR_SUCCESS', 0, RegCloseKey(hkey))
91
91
  t.check('open deleted → ERROR_FILE_NOT_FOUND', 2,
92
- RegOpenKeyEx(gui.HKey.CURRENT_USER, KEY, 0, gui.RegAccess.READ,
92
+ RegOpenKeyEx(HKey.CURRENT_USER, KEY, 0, RegAccess.READ,
93
93
  new PtrArrayBuffer(8)))
94
94
  },
95
95
  }
@@ -115,7 +115,7 @@ export const suite = {
115
115
  sock.set_on_event(s, (event) => {
116
116
  if (done)
117
117
  return;
118
- if (event.lNetworkEvents & 16 /* sock.FdEvent.FD_CONNECT */) {
118
+ if (event.lNetworkEvents & 16 /* FdEvent.FD_CONNECT */) {
119
119
  if (event.iErrorCode[0] !== 0) {
120
120
  assert('connect error code 0', false);
121
121
  finish();
@@ -129,7 +129,7 @@ export const suite = {
129
129
  finish();
130
130
  return;
131
131
  }
132
- wolfssl.wolfSSL_CTX_set_verify(ctx, 0 /* wolfssl.VerifyMode.SSL_VERIFY_NONE */);
132
+ wolfssl.wolfSSL_CTX_set_verify(ctx, 0 /* VerifyMode.SSL_VERIFY_NONE */);
133
133
  ssl = wolfssl.wolfSSL_new(ctx);
134
134
  if (!ssl) {
135
135
  assert('SSL_new', false);
@@ -137,11 +137,11 @@ export const suite = {
137
137
  return;
138
138
  }
139
139
  wolfssl.wolfSSL_set_fd(ssl, sock.get_fd(s));
140
- wolfssl.wolfSSL_UseSNI(ssl, 0 /* wolfssl.SniType.WOLFSSL_SNI_HOST_NAME */, 'localhost');
140
+ wolfssl.wolfSSL_UseSNI(ssl, 0 /* SniType.WOLFSSL_SNI_HOST_NAME */, 'localhost');
141
141
  // kick handshake immediately (FD_WRITE may not re-fire)
142
142
  {
143
143
  const ret = wolfssl.wolfSSL_connect(ssl);
144
- if (ret === 1 /* wolfssl.ReturnCode.SSL_SUCCESS */) {
144
+ if (ret === 1 /* ReturnCode.SSL_SUCCESS */) {
145
145
  handshakeDone = true;
146
146
  sendReq();
147
147
  }
@@ -154,13 +154,13 @@ export const suite = {
154
154
  }
155
155
  }
156
156
  }
157
- if ((event.lNetworkEvents & 1 /* sock.FdEvent.FD_READ */) ||
158
- (event.lNetworkEvents & 2 /* sock.FdEvent.FD_WRITE */)) {
157
+ if ((event.lNetworkEvents & 1 /* FdEvent.FD_READ */) ||
158
+ (event.lNetworkEvents & 2 /* FdEvent.FD_WRITE */)) {
159
159
  if (!ssl)
160
160
  return;
161
161
  if (!handshakeDone) {
162
162
  const ret = wolfssl.wolfSSL_connect(ssl);
163
- if (ret === 1 /* wolfssl.ReturnCode.SSL_SUCCESS */) {
163
+ if (ret === 1 /* ReturnCode.SSL_SUCCESS */) {
164
164
  handshakeDone = true;
165
165
  sendReq();
166
166
  }
@@ -176,7 +176,7 @@ export const suite = {
176
176
  if (sentRequest)
177
177
  onReadable();
178
178
  }
179
- if (event.lNetworkEvents & 32 /* sock.FdEvent.FD_CLOSE */) {
179
+ if (event.lNetworkEvents & 32 /* FdEvent.FD_CLOSE */) {
180
180
  // drain remaining then finish
181
181
  if (ssl && sentRequest && !sawNonNumber) {
182
182
  onReadable();