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
@@ -9,6 +9,7 @@ import { BITMAPINFOHEADER, OPENFILENAMEW } from '../lib/windows/structs.js'
9
9
  import { GetOpenFileName } from '../lib/windows/comdlg32.js'
10
10
  import { GetDC, ReleaseDC } from '../lib/windows/user32.js'
11
11
  import { PatBlt, SetDIBitsToDevice } from '../lib/windows/gdi32.js'
12
+ import { Gwlp, MouseKeyFlag, ScrollBar, ScrollCmd, SetWindowPosFlag, SetWindowPosHwnd, WindowStyle, WmMsg } from '../constants'
12
13
 
13
14
  type MuPdf = typeof import('../vendor/mupdf-wasm/mupdf.js')
14
15
 
@@ -120,32 +121,32 @@ function updateScrollRange(): void {
120
121
  scrollX = Math.min(scrollX, maxX)
121
122
  scrollY = Math.min(scrollY, maxY)
122
123
  if (currentPixmap.w > cw) {
123
- const style = gui.GetWindowLongPtr(hwndCanvas, gui.Gwlp.STYLE) | 0
124
- if (!(style & gui.WindowStyle.HSCROLL)) {
125
- gui.SetWindowLongPtr(hwndCanvas, gui.Gwlp.STYLE, style | gui.WindowStyle.HSCROLL)
126
- gui.SetWindowPos(hwndCanvas, gui.SetWindowPosHwnd.TOP, 0, 0, 0, 0,
127
- gui.SetWindowPosFlag.SWP_NOMOVE | gui.SetWindowPosFlag.SWP_NOSIZE |
128
- gui.SetWindowPosFlag.SWP_NOZORDER | gui.SetWindowPosFlag.SWP_FRAMECHANGED)
124
+ const style = gui.GetWindowLongPtr(hwndCanvas, Gwlp.STYLE) | 0
125
+ if (!(style & WindowStyle.HSCROLL)) {
126
+ gui.SetWindowLongPtr(hwndCanvas, Gwlp.STYLE, style | WindowStyle.HSCROLL)
127
+ gui.SetWindowPos(hwndCanvas, SetWindowPosHwnd.TOP, 0, 0, 0, 0,
128
+ SetWindowPosFlag.SWP_NOMOVE | SetWindowPosFlag.SWP_NOSIZE |
129
+ SetWindowPosFlag.SWP_NOZORDER | SetWindowPosFlag.SWP_FRAMECHANGED)
129
130
  }
130
- gui.SetScrollInfo(hwndCanvas, gui.ScrollBar.HORZ, { min: 0, max: currentPixmap.w - 1, page: cw, pos: scrollX }, true)
131
- gui.ShowScrollBar(hwndCanvas, gui.ScrollBar.HORZ, true)
131
+ gui.SetScrollInfo(hwndCanvas, ScrollBar.HORZ, { min: 0, max: currentPixmap.w - 1, page: cw, pos: scrollX }, true)
132
+ gui.ShowScrollBar(hwndCanvas, ScrollBar.HORZ, true)
132
133
  } else {
133
134
  scrollX = 0
134
- const style = gui.GetWindowLongPtr(hwndCanvas, gui.Gwlp.STYLE) | 0
135
- if (style & gui.WindowStyle.HSCROLL) {
136
- gui.SetWindowLongPtr(hwndCanvas, gui.Gwlp.STYLE, style & ~gui.WindowStyle.HSCROLL)
137
- gui.SetWindowPos(hwndCanvas, gui.SetWindowPosHwnd.TOP, 0, 0, 0, 0,
138
- gui.SetWindowPosFlag.SWP_NOMOVE | gui.SetWindowPosFlag.SWP_NOSIZE |
139
- gui.SetWindowPosFlag.SWP_NOZORDER | gui.SetWindowPosFlag.SWP_FRAMECHANGED)
135
+ const style = gui.GetWindowLongPtr(hwndCanvas, Gwlp.STYLE) | 0
136
+ if (style & WindowStyle.HSCROLL) {
137
+ gui.SetWindowLongPtr(hwndCanvas, Gwlp.STYLE, style & ~WindowStyle.HSCROLL)
138
+ gui.SetWindowPos(hwndCanvas, SetWindowPosHwnd.TOP, 0, 0, 0, 0,
139
+ SetWindowPosFlag.SWP_NOMOVE | SetWindowPosFlag.SWP_NOSIZE |
140
+ SetWindowPosFlag.SWP_NOZORDER | SetWindowPosFlag.SWP_FRAMECHANGED)
140
141
  }
141
- gui.ShowScrollBar(hwndCanvas, gui.ScrollBar.HORZ, false)
142
+ gui.ShowScrollBar(hwndCanvas, ScrollBar.HORZ, false)
142
143
  }
143
144
  if (currentPixmap.h > ch) {
144
- gui.SetScrollInfo(hwndCanvas, gui.ScrollBar.VERT, { min: 0, max: currentPixmap.h - 1, page: ch, pos: scrollY }, true)
145
- gui.ShowScrollBar(hwndCanvas, gui.ScrollBar.VERT, true)
146
- } else { scrollY = 0; gui.ShowScrollBar(hwndCanvas, gui.ScrollBar.VERT, false) }
147
- gui.SetWindowPos(hwndContent, gui.SetWindowPosHwnd.TOP, -scrollX, -scrollY, 0, 0,
148
- gui.SetWindowPosFlag.SWP_NOSIZE | gui.SetWindowPosFlag.SWP_NOZORDER)
145
+ gui.SetScrollInfo(hwndCanvas, ScrollBar.VERT, { min: 0, max: currentPixmap.h - 1, page: ch, pos: scrollY }, true)
146
+ gui.ShowScrollBar(hwndCanvas, ScrollBar.VERT, true)
147
+ } else { scrollY = 0; gui.ShowScrollBar(hwndCanvas, ScrollBar.VERT, false) }
148
+ gui.SetWindowPos(hwndContent, SetWindowPosHwnd.TOP, -scrollX, -scrollY, 0, 0,
149
+ SetWindowPosFlag.SWP_NOSIZE | SetWindowPosFlag.SWP_NOZORDER)
149
150
  }
150
151
 
151
152
  function showPdf(mupdf: MuPdf, path: string, pageIdx: number): void {
@@ -155,8 +156,8 @@ function showPdf(mupdf: MuPdf, path: string, pageIdx: number): void {
155
156
  currentPixmap = pix; currentPage = pageIdx; totalPages = pix.totalPages
156
157
  gui.SetWindowText(hwndMain, 'PDF 预览 - 第 ' + (pageIdx + 1) + '/' + totalPages + ' 页')
157
158
  scrollX = 0; scrollY = 0
158
- gui.SetWindowPos(hwndContent, gui.SetWindowPosHwnd.TOP, 0, 0, pix.w, pix.h,
159
- gui.SetWindowPosFlag.SWP_NOZORDER | gui.SetWindowPosFlag.SWP_NOMOVE)
159
+ gui.SetWindowPos(hwndContent, SetWindowPosHwnd.TOP, 0, 0, pix.w, pix.h,
160
+ SetWindowPosFlag.SWP_NOZORDER | SetWindowPosFlag.SWP_NOMOVE)
160
161
  updateScrollRange()
161
162
  gui.InvalidateRect(hwndContent, null, true)
162
163
  }
@@ -170,19 +171,19 @@ function doScroll(dx: number, dy: number): void {
170
171
  const maxY = Math.max(0, currentPixmap.h - ch)
171
172
  scrollX = Math.max(0, Math.min(maxX, scrollX + dx))
172
173
  scrollY = Math.max(0, Math.min(maxY, scrollY + dy))
173
- gui.SetWindowPos(hwndContent, gui.SetWindowPosHwnd.TOP, -scrollX, -scrollY, 0, 0,
174
- gui.SetWindowPosFlag.SWP_NOSIZE | gui.SetWindowPosFlag.SWP_NOZORDER)
175
- gui.SetScrollInfo(hwndCanvas, gui.ScrollBar.HORZ, { pos: scrollX }, true)
176
- gui.SetScrollInfo(hwndCanvas, gui.ScrollBar.VERT, { pos: scrollY }, true)
174
+ gui.SetWindowPos(hwndContent, SetWindowPosHwnd.TOP, -scrollX, -scrollY, 0, 0,
175
+ SetWindowPosFlag.SWP_NOSIZE | SetWindowPosFlag.SWP_NOZORDER)
176
+ gui.SetScrollInfo(hwndCanvas, ScrollBar.HORZ, { pos: scrollX }, true)
177
+ gui.SetScrollInfo(hwndCanvas, ScrollBar.VERT, { pos: scrollY }, true)
177
178
  }
178
179
 
179
180
  async function main(): Promise<void> {
180
181
  const mupdf = await loadMupdf()
181
182
  if (!mupdf) { gui.MessageBox('加载 mupdf WASM 失败'); return }
182
183
 
183
- const WS_CHILD = gui.WindowStyle.CHILD
184
- const WS_VIS = gui.WindowStyle.VISIBLE
185
- const WS_BORDER = gui.WindowStyle.BORDER
184
+ const WS_CHILD = WindowStyle.CHILD
185
+ const WS_VIS = WindowStyle.VISIBLE
186
+ const WS_BORDER = WindowStyle.BORDER
186
187
  const ctrlY = 12, ctrlH = 26, gap = 4, btnW = 80, btnPageW = 72
187
188
 
188
189
  let hwndBtnOpen: gui.HWND | null = null
@@ -191,18 +192,18 @@ let hwndBtnNext: gui.HWND | null = null
191
192
 
192
193
  gui.RegisterClass('PdfViewer2', (hwnd, msg, wParam, lParam) => {
193
194
  assertNonNullable(hwndCanvas); assertNonNullable(hwndEdit); assertNonNullable(hwndBtnOpen); assertNonNullable(hwndBtnPrev); assertNonNullable(hwndBtnNext)
194
- if (msg === gui.WmMsg.DESTROY) { gui.PostQuitMessage(0); return 0 }
195
- if (msg === gui.WmMsg.SIZE) {
195
+ if (msg === WmMsg.DESTROY) { gui.PostQuitMessage(0); return 0 }
196
+ if (msg === WmMsg.SIZE) {
196
197
  const cr = gui.GetClientRect(hwnd)
197
198
  if (cr) {
198
199
  const cw = cr.right - cr.left, ch = cr.bottom - cr.top
199
- gui.SetWindowPos(hwndCanvas, gui.SetWindowPosHwnd.TOP, 0, 50, cw, Math.max(1, ch - 50), gui.SetWindowPosFlag.SWP_NOZORDER)
200
- gui.SetWindowPos(hwndEdit, gui.SetWindowPosHwnd.TOP, 0, 0, Math.max(100, cw - 320), 0,
201
- gui.SetWindowPosFlag.SWP_NOMOVE | gui.SetWindowPosFlag.SWP_NOZORDER)
200
+ gui.SetWindowPos(hwndCanvas, SetWindowPosHwnd.TOP, 0, 50, cw, Math.max(1, ch - 50), SetWindowPosFlag.SWP_NOZORDER)
201
+ gui.SetWindowPos(hwndEdit, SetWindowPosHwnd.TOP, 0, 0, Math.max(100, cw - 320), 0,
202
+ SetWindowPosFlag.SWP_NOMOVE | SetWindowPosFlag.SWP_NOZORDER)
202
203
  }
203
204
  return gui.DefWindowProc(hwnd, msg, wParam, lParam)
204
205
  }
205
- if (msg === gui.WmMsg.COMMAND) {
206
+ if (msg === WmMsg.COMMAND) {
206
207
  const hCtrl = lParam
207
208
  if (hCtrl === hwndBtnOpen) {
208
209
  const path = openPdfFileDialog()
@@ -219,7 +220,7 @@ let hwndBtnNext: gui.HWND | null = null
219
220
  return gui.DefWindowProc(hwnd, msg, wParam, lParam)
220
221
  })
221
222
  hwndMain = gui.CreateWindow('PdfViewer2', 'PDF 预览 2',
222
- gui.WindowStyle.OVERLAPPEDWINDOW | gui.WindowStyle.CLIPCHILDREN,
223
+ WindowStyle.OVERLAPPEDWINDOW | WindowStyle.CLIPCHILDREN,
223
224
  100, 100, 1100, 800, null, null)!
224
225
  if (!hwndMain) { gui.MessageBox('创建主窗口失败'); return }
225
226
 
@@ -239,7 +240,7 @@ let hwndBtnNext: gui.HWND | null = null
239
240
 
240
241
  // 画布(带滚动条)
241
242
  hwndCanvas = gui.CreateWindow('STATIC', '',
242
- WS_CHILD | WS_VIS | gui.WindowStyle.CLIPCHILDREN | gui.WindowStyle.VSCROLL | gui.WindowStyle.HSCROLL,
243
+ WS_CHILD | WS_VIS | WindowStyle.CLIPCHILDREN | WindowStyle.VSCROLL | WindowStyle.HSCROLL,
243
244
  0, 50, 1100, 750, hwndMain, null)!
244
245
 
245
246
  // 内容窗口(画 pixmap)
@@ -256,8 +257,8 @@ let hwndBtnNext: gui.HWND | null = null
256
257
 
257
258
  // 内容窗口 PAINT
258
259
  gui.SetWindowProc(hwndContent, (hwnd: gui.HWND, msg: number, wParam: number, lParam: number): number => {
259
- if (msg === gui.WmMsg.ERASEBKGND) return 1
260
- if (msg === gui.WmMsg.PAINT) {
260
+ if (msg === WmMsg.ERASEBKGND) return 1
261
+ if (msg === WmMsg.PAINT) {
261
262
  gui.DefWindowProc(hwnd, msg, wParam, lParam)
262
263
  const pm = currentPixmap
263
264
  if (!pm) return 0
@@ -274,8 +275,8 @@ let hwndBtnNext: gui.HWND | null = null
274
275
 
275
276
  // 画布消息处理(PAINT 填白、滚动条、滚轮)
276
277
  gui.SetWindowProc(hwndCanvas, (hwnd: gui.HWND, msg: number, wParam: number, lParam: number): number => {
277
- if (msg === gui.WmMsg.ERASEBKGND) return 1
278
- if (msg === gui.WmMsg.PAINT) {
278
+ if (msg === WmMsg.ERASEBKGND) return 1
279
+ if (msg === WmMsg.PAINT) {
279
280
  const cr = gui.GetClientRect(hwnd)
280
281
  if (cr) {
281
282
  const cw = cr.right - cr.left, ch = cr.bottom - cr.top
@@ -288,29 +289,29 @@ let hwndBtnNext: gui.HWND | null = null
288
289
  gui.DefWindowProc(hwnd, msg, wParam, lParam)
289
290
  return 0
290
291
  }
291
- if (msg === gui.WmMsg.VSCROLL || msg === gui.WmMsg.HSCROLL) {
292
- const bar = msg === gui.WmMsg.VSCROLL ? gui.ScrollBar.VERT : gui.ScrollBar.HORZ
292
+ if (msg === WmMsg.VSCROLL || msg === WmMsg.HSCROLL) {
293
+ const bar = msg === WmMsg.VSCROLL ? ScrollBar.VERT : ScrollBar.HORZ
293
294
  const info = gui.GetScrollInfo(hwnd, bar)
294
295
  const maxPos = info.max - info.page + 1
295
296
  const code = wParam & 0xFFFF
296
- let newPos = bar === gui.ScrollBar.VERT ? scrollY : scrollX
297
- if (code === gui.ScrollCmd.THUMBTRACK || code === gui.ScrollCmd.THUMBPOSITION)
297
+ let newPos = bar === ScrollBar.VERT ? scrollY : scrollX
298
+ if (code === ScrollCmd.THUMBTRACK || code === ScrollCmd.THUMBPOSITION)
298
299
  newPos = Math.max(0, Math.min(maxPos, (wParam >> 16) & 0xFFFF))
299
- else if (code === gui.ScrollCmd.LINEUP) newPos -= 20
300
- else if (code === gui.ScrollCmd.LINEDOWN) newPos += 20
301
- else if (code === gui.ScrollCmd.PAGEUP) newPos -= info.page
302
- else if (code === gui.ScrollCmd.PAGEDOWN) newPos += info.page
300
+ else if (code === ScrollCmd.LINEUP) newPos -= 20
301
+ else if (code === ScrollCmd.LINEDOWN) newPos += 20
302
+ else if (code === ScrollCmd.PAGEUP) newPos -= info.page
303
+ else if (code === ScrollCmd.PAGEDOWN) newPos += info.page
303
304
  else return 0
304
305
  newPos = Math.max(0, Math.min(maxPos, newPos))
305
- if (bar === gui.ScrollBar.VERT) doScroll(0, newPos - scrollY)
306
+ if (bar === ScrollBar.VERT) doScroll(0, newPos - scrollY)
306
307
  else doScroll(newPos - scrollX, 0)
307
308
  return 0
308
309
  }
309
- if (msg === gui.WmMsg.MOUSEWHEEL) {
310
+ if (msg === WmMsg.MOUSEWHEEL) {
310
311
  const raw = (wParam >>> 16) & 0xFFFF
311
312
  const wheel = raw >= 0x8000 ? raw - 0x10000 : raw
312
- const isHorz = (wParam & gui.MouseKeyFlag.MK_SHIFT) !== 0
313
- const bar = isHorz ? gui.ScrollBar.HORZ : gui.ScrollBar.VERT
313
+ const isHorz = (wParam & MouseKeyFlag.MK_SHIFT) !== 0
314
+ const bar = isHorz ? ScrollBar.HORZ : ScrollBar.VERT
314
315
  const info = gui.GetScrollInfo(hwnd, bar)
315
316
  const maxPos = info.max - info.page + 1
316
317
  let newPos = (isHorz ? scrollX : scrollY) - Math.round(wheel * 40 / 120)
@@ -319,7 +320,7 @@ let hwndBtnNext: gui.HWND | null = null
319
320
  else doScroll(0, newPos - scrollY)
320
321
  return 0
321
322
  }
322
- if (msg === gui.WmMsg.SIZE) { updateScrollRange(); return gui.DefWindowProc(hwnd, msg, wParam, lParam) }
323
+ if (msg === WmMsg.SIZE) { updateScrollRange(); return gui.DefWindowProc(hwnd, msg, wParam, lParam) }
323
324
  return gui.DefWindowProc(hwnd, msg, wParam, lParam)
324
325
  })
325
326
 
@@ -16579,6 +16579,14 @@ var LVCOLUMNW_DECL = {
16579
16579
  cxIdeal: "i32"
16580
16580
  };
16581
16581
  var LVCOLUMNW = /* @__PURE__ */ struct("LVCOLUMNW", LVCOLUMNW_DECL);
16582
+ var NOTIFYICONIDENTIFIER_DECL = {
16583
+ "#": "struct",
16584
+ cbSize: "u32",
16585
+ hWnd: "<HWND>ptr",
16586
+ uID: "u32",
16587
+ guidItem: "u32[4]"
16588
+ };
16589
+ var NOTIFYICONIDENTIFIER = /* @__PURE__ */ struct("NOTIFYICONIDENTIFIER", NOTIFYICONIDENTIFIER_DECL);
16582
16590
 
16583
16591
  // _build/lib/windows/user32.js
16584
16592
  var b = (name, sig, encoders) => bind("user32.dll", name, sig, encoders);
@@ -16645,14 +16653,14 @@ function applyProps(instance, newProps, _oldProps) {
16645
16653
  gui.ShowWindow(
16646
16654
  hwnd,
16647
16655
  newProps.hidden ? 0 : 5
16648
- /* gui.ShowWindowCmd.SHOW */
16656
+ /* ShowWindowCmd.SHOW */
16649
16657
  );
16650
16658
  }
16651
16659
  if ("visible" in newProps) {
16652
16660
  gui.ShowWindow(
16653
16661
  hwnd,
16654
16662
  newProps.visible ? 5 : 0
16655
- /* gui.ShowWindowCmd.HIDE */
16663
+ /* ShowWindowCmd.HIDE */
16656
16664
  );
16657
16665
  }
16658
16666
  }
@@ -16748,7 +16756,7 @@ function measureText(hdc, text, maxWidth) {
16748
16756
  -1,
16749
16757
  r.ptr,
16750
16758
  1024
16751
- /* gui.DrawTextFlag.CALCRECT */
16759
+ /* DrawTextFlag.CALCRECT */
16752
16760
  );
16753
16761
  const { right, bottom } = RECT.decode(r);
16754
16762
  return { width: right, height: bottom };
@@ -16796,7 +16804,7 @@ function setupWindowProc(instance, hwnd) {
16796
16804
  const oldProc = GetWindowLongPtr(
16797
16805
  hwnd,
16798
16806
  -4
16799
- /* gui.Gwlp.WNDPROC */
16807
+ /* Gwlp.WNDPROC */
16800
16808
  );
16801
16809
  instancesByHwnd.set(hwnd, instance);
16802
16810
  gui3.SetWindowProc(hwnd, (hwnd2, msg, wParam, lParam) => {
@@ -16884,7 +16892,7 @@ function runFlexLayout(inst) {
16884
16892
  r.width * scaleFactor,
16885
16893
  r.height * scaleFactor,
16886
16894
  64
16887
- /* gui.SetWindowPosFlag.SWP_SHOWWINDOW */
16895
+ /* SetWindowPosFlag.SWP_SHOWWINDOW */
16888
16896
  );
16889
16897
  InvalidateRect(child.hwnd, NULL, 1);
16890
16898
  child.lastRect = { x: r.x, y: r.y, w: r.width, h: r.height };
@@ -17040,7 +17048,7 @@ var hostConfig = {
17040
17048
  gui3.ShowWindow(
17041
17049
  instance.hwnd,
17042
17050
  0
17043
- /* gui.ShowWindowCmd.HIDE */
17051
+ /* ShowWindowCmd.HIDE */
17044
17052
  );
17045
17053
  },
17046
17054
  hideTextInstance(instance) {
@@ -17048,7 +17056,7 @@ var hostConfig = {
17048
17056
  gui3.ShowWindow(
17049
17057
  instance.hwnd,
17050
17058
  0
17051
- /* gui.ShowWindowCmd.HIDE */
17059
+ /* ShowWindowCmd.HIDE */
17052
17060
  );
17053
17061
  },
17054
17062
  unhideInstance(instance, _props) {
@@ -17056,7 +17064,7 @@ var hostConfig = {
17056
17064
  gui3.ShowWindow(
17057
17065
  instance.hwnd,
17058
17066
  5
17059
- /* gui.ShowWindowCmd.SHOW */
17067
+ /* ShowWindowCmd.SHOW */
17060
17068
  );
17061
17069
  },
17062
17070
  unhideTextInstance(instance, _text) {
@@ -17064,7 +17072,7 @@ var hostConfig = {
17064
17072
  gui3.ShowWindow(
17065
17073
  instance.hwnd,
17066
17074
  5
17067
- /* gui.ShowWindowCmd.SHOW */
17075
+ /* ShowWindowCmd.SHOW */
17068
17076
  );
17069
17077
  },
17070
17078
  shouldSetTextContent(_type, props) {
@@ -17492,7 +17500,7 @@ function getCellFont(hwnd, style) {
17492
17500
  ...base,
17493
17501
  ...style.bold ? {
17494
17502
  lfWeight: 700
17495
- /* gui.FontWeight.BOLD */
17503
+ /* FontWeight.BOLD */
17496
17504
  } : {},
17497
17505
  ...style.italic ? { lfItalic: 1 } : {},
17498
17506
  ...style.underline ? { lfUnderline: 1 } : {}
@@ -17614,7 +17622,7 @@ var ListView = (0, import_react9.forwardRef)(function ListViewInner({ columns, d
17614
17622
  4150,
17615
17623
  0,
17616
17624
  32 | 1 | 65536
17617
- /* gui.LvExStyle.DOUBLEBUFFER */
17625
+ /* LvExStyle.DOUBLEBUFFER */
17618
17626
  );
17619
17627
  const n = columns.length;
17620
17628
  for (let j = 0; j < n; j++) {
@@ -17659,7 +17667,7 @@ var ListView = (0, import_react9.forwardRef)(function ListViewInner({ columns, d
17659
17667
  4126,
17660
17668
  j,
17661
17669
  -2
17662
- /* gui.LvColumnWidthCmd.AUTOSIZE_USEHEADER */
17670
+ /* LvColumnWidthCmd.AUTOSIZE_USEHEADER */
17663
17671
  );
17664
17672
  }
17665
17673
  }
@@ -17801,7 +17809,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17801
17809
  natW,
17802
17810
  natH,
17803
17811
  4
17804
- /* gui.SetWindowPosFlag.SWP_NOZORDER */
17812
+ /* SetWindowPosFlag.SWP_NOZORDER */
17805
17813
  );
17806
17814
  forceFlexLayout(content);
17807
17815
  if (natW > svW) {
@@ -17840,7 +17848,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17840
17848
  0,
17841
17849
  0,
17842
17850
  1 | 4
17843
- /* gui.SetWindowPosFlag.SWP_NOZORDER */
17851
+ /* SetWindowPosFlag.SWP_NOZORDER */
17844
17852
  );
17845
17853
  gui12.SetScrollInfo(sv, bar, { pos: newPos }, true);
17846
17854
  }
@@ -17906,7 +17914,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17906
17914
  handleScroll(
17907
17915
  e,
17908
17916
  1
17909
- /* gui.ScrollBar.VERT */
17917
+ /* ScrollBar.VERT */
17910
17918
  );
17911
17919
  return 0;
17912
17920
  }
@@ -17914,7 +17922,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17914
17922
  handleScroll(
17915
17923
  e,
17916
17924
  0
17917
- /* gui.ScrollBar.HORZ */
17925
+ /* ScrollBar.HORZ */
17918
17926
  );
17919
17927
  return 0;
17920
17928
  }
@@ -18078,7 +18086,7 @@ function deleteAllItems(hTree) {
18078
18086
  4353,
18079
18087
  1,
18080
18088
  -65536
18081
- /* gui.TvInsertAfter.ROOT */
18089
+ /* TvInsertAfter.ROOT */
18082
18090
  );
18083
18091
  }
18084
18092
  var TreeView = (0, import_react16.forwardRef)(function TreeViewInner({ data, onSelect, defaultSelectedKey, selectedKey: controlledKey, style }, ref) {
@@ -18110,7 +18118,7 @@ var TreeView = (0, import_react16.forwardRef)(function TreeViewInner({ data, onS
18110
18118
  4396,
18111
18119
  0,
18112
18120
  4
18113
- /* gui.TvExStyle.DOUBLEBUFFER */
18121
+ /* TvExStyle.DOUBLEBUFFER */
18114
18122
  );
18115
18123
  }, []);
18116
18124
  (0, import_react16.useEffect)(() => {
@@ -18152,9 +18160,16 @@ var b3 = (name, sig) => bind("comdlg32.dll", name, sig);
18152
18160
  var GetOpenFileName = /* @__PURE__ */ b3("GetOpenFileNameW", "<OPENFILENAMEW>ptr -> u32");
18153
18161
 
18154
18162
  // _build/lib/windows/shell32.js
18155
- var b4 = (name, sig) => bind("shell32.dll", name, sig);
18163
+ var b4 = (name, sig, encoders) => bind("shell32.dll", name, sig, encoders);
18156
18164
  var SHBrowseForFolder = /* @__PURE__ */ b4("SHBrowseForFolderW", "<BROWSEINFOW>ptr -> <>ptr");
18157
18165
  var SHGetPathFromIDList = /* @__PURE__ */ b4("SHGetPathFromIDListW", "<>ptr <BYTE>ptr -> u32");
18166
+ var Shell_NotifyIconGetRect = (() => {
18167
+ try {
18168
+ return b4("Shell_NotifyIconGetRect", "<NOTIFYICONIDENTIFIER>ptr <RECT>ptr -> i32", { NOTIFYICONIDENTIFIER });
18169
+ } catch {
18170
+ return null;
18171
+ }
18172
+ })();
18158
18173
 
18159
18174
  // _build/lib/windows/ole32.js
18160
18175
  var b5 = (name, sig) => bind("ole32.dll", name, sig);
@@ -9,6 +9,7 @@ import { WCHAR } from '../lib/ffi/bind.js'
9
9
  import { PdfCanvas } from './PdfCanvas.js'
10
10
  import { OPENFILENAMEW } from '../lib/windows/structs.js'
11
11
  import { GetOpenFileName } from '../lib/windows/comdlg32.js'
12
+ import { WindowStyle } from '../constants'
12
13
 
13
14
  type MuPdf = typeof import('../vendor/mupdf-wasm/mupdf.js')
14
15
 
@@ -180,17 +181,17 @@ function App({ mupdf, mainHwnd: hwnd }: { mupdf: MuPdf; mainHwnd: gui.HWND }) {
180
181
 
181
182
  return (
182
183
  <w type="STATIC"
183
- ws={gui.WindowStyle.VISIBLE | gui.WindowStyle.CLIPCHILDREN}
184
+ ws={WindowStyle.VISIBLE | WindowStyle.CLIPCHILDREN}
184
185
  style={{ flexDirection: 'column', gap: 4, width: 1180, height: 720 }}
185
186
  >
186
- <w type="STATIC" ws={gui.WindowStyle.VISIBLE}
187
+ <w type="STATIC" ws={WindowStyle.VISIBLE}
187
188
  style={{ flexDirection: 'row', gap: 6, alignItems: 'stretch', height: 28 }}
188
189
  >
189
190
  <w type="STATIC" style={{ width: 6 }} />
190
191
  <Button onClick={handleOpen} style={{ width: 80 }}>Open</Button>
191
192
  <Input value={filePath} placeholder="File path..." readonly style={{ flexGrow: 1 }} />
192
193
  <Button onClick={handlePrev} disabled={currentPage <= 0} style={{ width: 60 }}>Prev</Button>
193
- <w type="STATIC" ws={gui.WindowStyle.VISIBLE}
194
+ <w type="STATIC" ws={WindowStyle.VISIBLE}
194
195
  text={totalPages > 0 ? `Page ${currentPage + 1} / ${totalPages}` : 'No file'}
195
196
  style={{ width: 120 }}
196
197
  />
@@ -205,7 +206,7 @@ function App({ mupdf, mainHwnd: hwnd }: { mupdf: MuPdf; mainHwnd: gui.HWND }) {
205
206
  style={{ width: pixmap.w, height: pixmap.h }}
206
207
  />
207
208
  ) : (
208
- <w type="STATIC" ws={gui.WindowStyle.VISIBLE}
209
+ <w type="STATIC" ws={WindowStyle.VISIBLE}
209
210
  text="Open a PDF file to preview"
210
211
  style={{ width: 300, height: 30 }}
211
212
  />
@@ -225,7 +226,7 @@ async function main() {
225
226
  gui.RegisterClass('PdfViewerWin')
226
227
  const hwnd = gui.CreateWindow(
227
228
  'PdfViewerWin', 'PDF Viewer',
228
- gui.WindowStyle.OVERLAPPEDWINDOW,
229
+ WindowStyle.OVERLAPPEDWINDOW,
229
230
  100, 100, 1200, 800, null, null
230
231
  )
231
232
 
@@ -16575,6 +16575,14 @@ var LVCOLUMNW_DECL = {
16575
16575
  cxIdeal: "i32"
16576
16576
  };
16577
16577
  var LVCOLUMNW = /* @__PURE__ */ struct("LVCOLUMNW", LVCOLUMNW_DECL);
16578
+ var NOTIFYICONIDENTIFIER_DECL = {
16579
+ "#": "struct",
16580
+ cbSize: "u32",
16581
+ hWnd: "<HWND>ptr",
16582
+ uID: "u32",
16583
+ guidItem: "u32[4]"
16584
+ };
16585
+ var NOTIFYICONIDENTIFIER = /* @__PURE__ */ struct("NOTIFYICONIDENTIFIER", NOTIFYICONIDENTIFIER_DECL);
16578
16586
 
16579
16587
  // _build/lib/windows/user32.js
16580
16588
  var b = (name, sig, encoders) => bind("user32.dll", name, sig, encoders);
@@ -16640,14 +16648,14 @@ function applyProps(instance, newProps, _oldProps) {
16640
16648
  gui.ShowWindow(
16641
16649
  hwnd2,
16642
16650
  newProps.hidden ? 0 : 5
16643
- /* gui.ShowWindowCmd.SHOW */
16651
+ /* ShowWindowCmd.SHOW */
16644
16652
  );
16645
16653
  }
16646
16654
  if ("visible" in newProps) {
16647
16655
  gui.ShowWindow(
16648
16656
  hwnd2,
16649
16657
  newProps.visible ? 5 : 0
16650
- /* gui.ShowWindowCmd.HIDE */
16658
+ /* ShowWindowCmd.HIDE */
16651
16659
  );
16652
16660
  }
16653
16661
  }
@@ -16743,7 +16751,7 @@ function measureText(hdc, text, maxWidth) {
16743
16751
  -1,
16744
16752
  r.ptr,
16745
16753
  1024
16746
- /* gui.DrawTextFlag.CALCRECT */
16754
+ /* DrawTextFlag.CALCRECT */
16747
16755
  );
16748
16756
  const { right, bottom } = RECT.decode(r);
16749
16757
  return { width: right, height: bottom };
@@ -16791,7 +16799,7 @@ function setupWindowProc(instance, hwnd2) {
16791
16799
  const oldProc = GetWindowLongPtr(
16792
16800
  hwnd2,
16793
16801
  -4
16794
- /* gui.Gwlp.WNDPROC */
16802
+ /* Gwlp.WNDPROC */
16795
16803
  );
16796
16804
  instancesByHwnd.set(hwnd2, instance);
16797
16805
  gui3.SetWindowProc(hwnd2, (hwnd3, msg, wParam, lParam) => {
@@ -16879,7 +16887,7 @@ function runFlexLayout(inst) {
16879
16887
  r.width * scaleFactor,
16880
16888
  r.height * scaleFactor,
16881
16889
  64
16882
- /* gui.SetWindowPosFlag.SWP_SHOWWINDOW */
16890
+ /* SetWindowPosFlag.SWP_SHOWWINDOW */
16883
16891
  );
16884
16892
  InvalidateRect(child.hwnd, NULL, 1);
16885
16893
  child.lastRect = { x: r.x, y: r.y, w: r.width, h: r.height };
@@ -17035,7 +17043,7 @@ var hostConfig = {
17035
17043
  gui3.ShowWindow(
17036
17044
  instance.hwnd,
17037
17045
  0
17038
- /* gui.ShowWindowCmd.HIDE */
17046
+ /* ShowWindowCmd.HIDE */
17039
17047
  );
17040
17048
  },
17041
17049
  hideTextInstance(instance) {
@@ -17043,7 +17051,7 @@ var hostConfig = {
17043
17051
  gui3.ShowWindow(
17044
17052
  instance.hwnd,
17045
17053
  0
17046
- /* gui.ShowWindowCmd.HIDE */
17054
+ /* ShowWindowCmd.HIDE */
17047
17055
  );
17048
17056
  },
17049
17057
  unhideInstance(instance, _props) {
@@ -17051,7 +17059,7 @@ var hostConfig = {
17051
17059
  gui3.ShowWindow(
17052
17060
  instance.hwnd,
17053
17061
  5
17054
- /* gui.ShowWindowCmd.SHOW */
17062
+ /* ShowWindowCmd.SHOW */
17055
17063
  );
17056
17064
  },
17057
17065
  unhideTextInstance(instance, _text) {
@@ -17059,7 +17067,7 @@ var hostConfig = {
17059
17067
  gui3.ShowWindow(
17060
17068
  instance.hwnd,
17061
17069
  5
17062
- /* gui.ShowWindowCmd.SHOW */
17070
+ /* ShowWindowCmd.SHOW */
17063
17071
  );
17064
17072
  },
17065
17073
  shouldSetTextContent(_type, props) {
@@ -17487,7 +17495,7 @@ function getCellFont(hwnd2, style) {
17487
17495
  ...base,
17488
17496
  ...style.bold ? {
17489
17497
  lfWeight: 700
17490
- /* gui.FontWeight.BOLD */
17498
+ /* FontWeight.BOLD */
17491
17499
  } : {},
17492
17500
  ...style.italic ? { lfItalic: 1 } : {},
17493
17501
  ...style.underline ? { lfUnderline: 1 } : {}
@@ -17609,7 +17617,7 @@ var ListView = (0, import_react9.forwardRef)(function ListViewInner({ columns, d
17609
17617
  4150,
17610
17618
  0,
17611
17619
  32 | 1 | 65536
17612
- /* gui.LvExStyle.DOUBLEBUFFER */
17620
+ /* LvExStyle.DOUBLEBUFFER */
17613
17621
  );
17614
17622
  const n = columns.length;
17615
17623
  for (let j = 0; j < n; j++) {
@@ -17654,7 +17662,7 @@ var ListView = (0, import_react9.forwardRef)(function ListViewInner({ columns, d
17654
17662
  4126,
17655
17663
  j,
17656
17664
  -2
17657
- /* gui.LvColumnWidthCmd.AUTOSIZE_USEHEADER */
17665
+ /* LvColumnWidthCmd.AUTOSIZE_USEHEADER */
17658
17666
  );
17659
17667
  }
17660
17668
  }
@@ -17796,7 +17804,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17796
17804
  natW,
17797
17805
  natH,
17798
17806
  4
17799
- /* gui.SetWindowPosFlag.SWP_NOZORDER */
17807
+ /* SetWindowPosFlag.SWP_NOZORDER */
17800
17808
  );
17801
17809
  forceFlexLayout(content);
17802
17810
  if (natW > svW) {
@@ -17835,7 +17843,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17835
17843
  0,
17836
17844
  0,
17837
17845
  1 | 4
17838
- /* gui.SetWindowPosFlag.SWP_NOZORDER */
17846
+ /* SetWindowPosFlag.SWP_NOZORDER */
17839
17847
  );
17840
17848
  gui12.SetScrollInfo(sv, bar, { pos: newPos }, true);
17841
17849
  }
@@ -17901,7 +17909,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17901
17909
  handleScroll(
17902
17910
  e,
17903
17911
  1
17904
- /* gui.ScrollBar.VERT */
17912
+ /* ScrollBar.VERT */
17905
17913
  );
17906
17914
  return 0;
17907
17915
  }
@@ -17909,7 +17917,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
17909
17917
  handleScroll(
17910
17918
  e,
17911
17919
  0
17912
- /* gui.ScrollBar.HORZ */
17920
+ /* ScrollBar.HORZ */
17913
17921
  );
17914
17922
  return 0;
17915
17923
  }
@@ -18066,7 +18074,7 @@ function Tooltip({ text, children, balloon }) {
18066
18074
  0,
18067
18075
  0,
18068
18076
  2 | 1 | 16
18069
- /* gui.SetWindowPosFlag.SWP_NOACTIVATE */
18077
+ /* SetWindowPosFlag.SWP_NOACTIVATE */
18070
18078
  );
18071
18079
  const ti = buildToolInfo(hTarget, text);
18072
18080
  gui15.SendMessage(hTT, 1074, 0, ti.ptr);
@@ -18131,7 +18139,7 @@ function deleteAllItems(hTree) {
18131
18139
  4353,
18132
18140
  1,
18133
18141
  -65536
18134
- /* gui.TvInsertAfter.ROOT */
18142
+ /* TvInsertAfter.ROOT */
18135
18143
  );
18136
18144
  }
18137
18145
  var TreeView = (0, import_react16.forwardRef)(function TreeViewInner({ data, onSelect, defaultSelectedKey, selectedKey: controlledKey, style }, ref) {
@@ -18163,7 +18171,7 @@ var TreeView = (0, import_react16.forwardRef)(function TreeViewInner({ data, onS
18163
18171
  4396,
18164
18172
  0,
18165
18173
  4
18166
- /* gui.TvExStyle.DOUBLEBUFFER */
18174
+ /* TvExStyle.DOUBLEBUFFER */
18167
18175
  );
18168
18176
  }, []);
18169
18177
  (0, import_react16.useEffect)(() => {
@@ -18205,9 +18213,16 @@ var b3 = (name, sig) => bind("comdlg32.dll", name, sig);
18205
18213
  var GetOpenFileName = /* @__PURE__ */ b3("GetOpenFileNameW", "<OPENFILENAMEW>ptr -> u32");
18206
18214
 
18207
18215
  // _build/lib/windows/shell32.js
18208
- var b4 = (name, sig) => bind("shell32.dll", name, sig);
18216
+ var b4 = (name, sig, encoders) => bind("shell32.dll", name, sig, encoders);
18209
18217
  var SHBrowseForFolder = /* @__PURE__ */ b4("SHBrowseForFolderW", "<BROWSEINFOW>ptr -> <>ptr");
18210
18218
  var SHGetPathFromIDList = /* @__PURE__ */ b4("SHGetPathFromIDListW", "<>ptr <BYTE>ptr -> u32");
18219
+ var Shell_NotifyIconGetRect = (() => {
18220
+ try {
18221
+ return b4("Shell_NotifyIconGetRect", "<NOTIFYICONIDENTIFIER>ptr <RECT>ptr -> i32", { NOTIFYICONIDENTIFIER });
18222
+ } catch {
18223
+ return null;
18224
+ }
18225
+ })();
18211
18226
 
18212
18227
  // _build/lib/windows/ole32.js
18213
18228
  var b5 = (name, sig) => bind("ole32.dll", name, sig);