PyWebWinUI3 1.2.2__tar.gz → 1.2.3__tar.gz

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 (130) hide show
  1. {pywebwinui3-1.2.2/PyWebWinUI3.egg-info → pywebwinui3-1.2.3}/PKG-INFO +1 -1
  2. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3/PyWebWinUI3.egg-info}/PKG-INFO +1 -1
  3. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/__init__.py +1 -1
  4. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/core.py +169 -52
  5. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/event.py +3 -1
  6. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/LICENSE +0 -0
  7. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/MANIFEST.in +0 -0
  8. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/NOTICE +0 -0
  9. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/PyWebWinUI3.egg-info/SOURCES.txt +0 -0
  10. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/PyWebWinUI3.egg-info/dependency_links.txt +0 -0
  11. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/PyWebWinUI3.egg-info/requires.txt +0 -0
  12. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/PyWebWinUI3.egg-info/top_level.txt +0 -0
  13. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/README.md +0 -0
  14. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pyproject.toml +0 -0
  15. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/type.py +0 -0
  16. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/util.py +0 -0
  17. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.0.woff2 +0 -0
  18. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.1.woff2 +0 -0
  19. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.10.woff2 +0 -0
  20. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.11.woff2 +0 -0
  21. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.12.woff2 +0 -0
  22. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.13.woff2 +0 -0
  23. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.14.woff2 +0 -0
  24. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.15.woff2 +0 -0
  25. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.16.woff2 +0 -0
  26. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.17.woff2 +0 -0
  27. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.18.woff2 +0 -0
  28. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.19.woff2 +0 -0
  29. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.2.woff2 +0 -0
  30. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.20.woff2 +0 -0
  31. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.21.woff2 +0 -0
  32. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.22.woff2 +0 -0
  33. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.23.woff2 +0 -0
  34. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.24.woff2 +0 -0
  35. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.25.woff2 +0 -0
  36. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.26.woff2 +0 -0
  37. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.27.woff2 +0 -0
  38. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.28.woff2 +0 -0
  39. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.29.woff2 +0 -0
  40. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.3.woff2 +0 -0
  41. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.30.woff2 +0 -0
  42. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.31.woff2 +0 -0
  43. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.32.woff2 +0 -0
  44. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.33.woff2 +0 -0
  45. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.34.woff2 +0 -0
  46. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.35.woff2 +0 -0
  47. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.36.woff2 +0 -0
  48. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.37.woff2 +0 -0
  49. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.38.woff2 +0 -0
  50. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.39.woff2 +0 -0
  51. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.4.woff2 +0 -0
  52. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.40.woff2 +0 -0
  53. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.41.woff2 +0 -0
  54. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.42.woff2 +0 -0
  55. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.43.woff2 +0 -0
  56. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.44.woff2 +0 -0
  57. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.45.woff2 +0 -0
  58. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.46.woff2 +0 -0
  59. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.47.woff2 +0 -0
  60. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.48.woff2 +0 -0
  61. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.49.woff2 +0 -0
  62. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.5.woff2 +0 -0
  63. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.50.woff2 +0 -0
  64. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.51.woff2 +0 -0
  65. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.52.woff2 +0 -0
  66. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.53.woff2 +0 -0
  67. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.54.woff2 +0 -0
  68. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.55.woff2 +0 -0
  69. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.56.woff2 +0 -0
  70. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.57.woff2 +0 -0
  71. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.58.woff2 +0 -0
  72. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.59.woff2 +0 -0
  73. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.6.woff2 +0 -0
  74. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.60.woff2 +0 -0
  75. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.61.woff2 +0 -0
  76. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.62.woff2 +0 -0
  77. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.63.woff2 +0 -0
  78. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.64.woff2 +0 -0
  79. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.65.woff2 +0 -0
  80. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.66.woff2 +0 -0
  81. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.67.woff2 +0 -0
  82. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.68.woff2 +0 -0
  83. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.69.woff2 +0 -0
  84. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.7.woff2 +0 -0
  85. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.70.woff2 +0 -0
  86. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.71.woff2 +0 -0
  87. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.72.woff2 +0 -0
  88. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.73.woff2 +0 -0
  89. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.74.woff2 +0 -0
  90. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.75.woff2 +0 -0
  91. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.76.woff2 +0 -0
  92. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.77.woff2 +0 -0
  93. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.78.woff2 +0 -0
  94. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.79.woff2 +0 -0
  95. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.8.woff2 +0 -0
  96. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.80.woff2 +0 -0
  97. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.81.woff2 +0 -0
  98. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.82.woff2 +0 -0
  99. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.83.woff2 +0 -0
  100. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.84.woff2 +0 -0
  101. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.85.woff2 +0 -0
  102. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.86.woff2 +0 -0
  103. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.87.woff2 +0 -0
  104. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.88.woff2 +0 -0
  105. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.89.woff2 +0 -0
  106. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.9.woff2 +0 -0
  107. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.90.woff2 +0 -0
  108. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/PretendardVariable.subset.91.woff2 +0 -0
  109. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/Pretendard/Variable-dynamic-subset.min.css +0 -0
  110. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/SegoeFluentIcons.ttf +0 -0
  111. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/_app/env.js +0 -0
  112. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/_app/immutable/assets/2.YxEoeVwz.css +0 -0
  113. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/_app/immutable/chunks/6pQH9Hkv.js +0 -0
  114. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/_app/immutable/chunks/B-XLOWlt.js +0 -0
  115. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/_app/immutable/chunks/CGGCsFu4.js +0 -0
  116. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/_app/immutable/chunks/CW0wlPPy.js +0 -0
  117. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/_app/immutable/chunks/CZPLFskb.js +0 -0
  118. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/_app/immutable/chunks/CZuXpvpo.js +0 -0
  119. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/_app/immutable/chunks/D94BNvJJ.js +0 -0
  120. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/_app/immutable/chunks/DF1x2LYX.js +0 -0
  121. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/_app/immutable/entry/app.B-Q6XOuJ.js +0 -0
  122. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/_app/immutable/entry/start.C1-i6FUr.js +0 -0
  123. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/_app/immutable/nodes/0.C49PHrK2.js +0 -0
  124. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/_app/immutable/nodes/1.a96iIGzo.js +0 -0
  125. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/_app/immutable/nodes/2.Ofs4dh3G.js +0 -0
  126. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/_app/version.json +0 -0
  127. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/pywebwinui3/web/index.html +0 -0
  128. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/requirements.txt +0 -0
  129. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/setup.cfg +0 -0
  130. {pywebwinui3-1.2.2 → pywebwinui3-1.2.3}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyWebWinUI3
3
- Version: 1.2.2
3
+ Version: 1.2.3
4
4
  Summary: Create modern WinUI3-style desktop UIs in Python using pywebview and a Svelte frontend.
5
5
  Home-page: https://github.com/Haruna5718/PyWebWinUI3
6
6
  Author: Haruna5718
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyWebWinUI3
3
- Version: 1.2.2
3
+ Version: 1.2.3
4
4
  Summary: Create modern WinUI3-style desktop UIs in Python using pywebview and a Svelte frontend.
5
5
  Home-page: https://github.com/Haruna5718/PyWebWinUI3
6
6
  Author: Haruna5718
@@ -1,3 +1,3 @@
1
1
  __all__ = ["core", "event", "util", "type"]
2
2
 
3
- __version__ = '1.2.2'
3
+ __version__ = '1.2.3'
@@ -16,7 +16,7 @@ from urllib.parse import unquote, urlparse, urlunparse
16
16
  from ctypes import wintypes
17
17
 
18
18
  import webview
19
- from hPyT import title_bar
19
+ from hPyT import title_bar, window_dwm
20
20
 
21
21
  from .event import Event, PathEvent
22
22
  from .type import Status
@@ -193,6 +193,7 @@ class _JsApi:
193
193
  class WindowEvents:
194
194
  def __init__(self) -> None:
195
195
  self.windowReady = Event()
196
+ self.closing = Event()
196
197
  self.closed = Event()
197
198
  self.accentColorChange = Event()
198
199
  self.valueChange = PathEvent()
@@ -211,6 +212,8 @@ class MainWindow:
211
212
  self._setup_fired = False
212
213
  self._minimum_width = DEFAULT_WINDOW_MIN_WIDTH
213
214
  self._minimum_height = DEFAULT_WINDOW_MIN_HEIGHT
215
+ self._defer_window_chrome = False
216
+ self._startup_cloaked = False
214
217
  self._sync_lock = threading.Lock()
215
218
  self._pending_sync: dict[str, object] = {}
216
219
  self._ui_server: _UiHttpServer | None = None
@@ -242,7 +245,7 @@ class MainWindow:
242
245
  _apply_menu_theme_support(self.values.get("system_theme"))
243
246
 
244
247
  self._window = webview.create_window(
245
- self._current_title(),
248
+ self.values.get("system_title", self._title),
246
249
  f"{self._ui_origin}/index.html",
247
250
  js_api=self.api,
248
251
  background_color="#202020",
@@ -252,16 +255,18 @@ class MainWindow:
252
255
  min_size=(self._minimum_width, self._minimum_height),
253
256
  on_top=bool(self.values.get("system_pin", False)),
254
257
  )
255
- self.show = self._window.show
256
- self.restore = self._window.restore
257
- self.hide = self._window.hide
258
- self.destroy = self._window.destroy
259
- self.minimize = self._window.minimize
258
+ self.show = self._show_window
259
+ self.restore = self._restore_window
260
+ self.hide = self._hide_window
261
+ self.destroy = self._destroy_window
262
+ self.minimize = self._minimize_window
260
263
  self.api._init(self)
261
264
  self._window.events.before_show += self._before_show
265
+ self._window.events.closing += self._on_closing
262
266
  self._window.events.closed += self._on_closed
263
- self._window.events.maximized += lambda *_: self._set_window_maximized_state(True)
264
- self._window.events.restored += lambda *_: self._set_window_maximized_state(False)
267
+ self._window.events.maximized += self._on_window_maximized_state
268
+ self._window.events.restored += self._on_window_restored_state
269
+ self._window.events.restored += self._on_window_restored
265
270
 
266
271
  core_logger.debug("Window created")
267
272
 
@@ -288,6 +293,9 @@ class MainWindow:
288
293
  def onSetup(self):
289
294
  return self._event_decorator(self.events.windowReady)
290
295
 
296
+ def onClosing(self):
297
+ return self._event_decorator(self.events.closing)
298
+
291
299
  def onExit(self):
292
300
  return self._event_decorator(self.events.closed)
293
301
 
@@ -317,11 +325,11 @@ class MainWindow:
317
325
  def addPage(self, pageFile: str | Path | None = None, pageData: dict | None = None):
318
326
  if pageFile and not pageData:
319
327
  pageData = loadPage(pageFile)
320
- logger.debug("Page added: %s", pageData["attr"]["path"])
321
- self.values["system_pages"] = {
322
- **(self.values["system_pages"] or {}),
323
- pageData["attr"]["path"]: pageData,
324
- }
328
+ page_path = str(pageData["attr"]["path"])
329
+ logger.debug("Page added: %s", page_path)
330
+ if self.values["system_pages"] is None:
331
+ self.values["system_pages"] = {}
332
+ self.values.set(f"system_pages[{json.dumps(page_path, ensure_ascii=False)}]", pageData)
325
333
 
326
334
  def resolve_path(self, value: str | Path | None) -> Path | None:
327
335
  if value is None:
@@ -341,9 +349,6 @@ class MainWindow:
341
349
 
342
350
  return root_candidate.resolve()
343
351
 
344
- def _current_title(self):
345
- return self.values.get("system_title", self._title)
346
-
347
352
  def _window_handle(self) -> int | None:
348
353
  try:
349
354
  native = getattr(self._window, "native", None)
@@ -437,24 +442,148 @@ class MainWindow:
437
442
  try:
438
443
  hwnd = self._window.native.Handle.ToInt64()
439
444
  _apply_menu_theme_support(self.values.get("system_theme"), hwnd)
440
- title_bar.hide(hwnd)
441
- self._set_window_maximized_state(bool(_user32.IsZoomed(hwnd)), sync=False)
445
+ if self._defer_window_chrome:
446
+ window_dwm.toggle_cloak(hwnd, True)
447
+ self._startup_cloaked = True
448
+ else:
449
+ title_bar.hide(hwnd)
450
+ self._set_window_maximized_state(bool(_user32.IsZoomed(hwnd)), sync=False)
442
451
  except Exception:
443
452
  core_logger.debug("Failed to hide title bar", exc_info=True)
444
453
 
454
+ def _invoke_native(self, native, callback):
455
+ action_type = getattr(importlib.import_module("System"), "Action")
456
+ if native.InvokeRequired:
457
+ native.BeginInvoke(action_type(callback))
458
+ else:
459
+ callback()
460
+
461
+ def _invoke_native_sync(self, native, callback):
462
+ action_type = getattr(importlib.import_module("System"), "Action")
463
+ if native.InvokeRequired:
464
+ native.Invoke(action_type(callback))
465
+ else:
466
+ callback()
467
+
468
+ def _invoke_native_later(self, native, callback, delay: float):
469
+ timer = threading.Timer(delay, lambda: self._invoke_native(native, callback))
470
+ timer.daemon = True
471
+ timer.start()
472
+
473
+ def _on_window_maximized_state(self, *_):
474
+ self._set_window_maximized_state(True)
475
+
476
+ def _on_window_restored_state(self, *_):
477
+ self._set_window_maximized_state(False)
478
+
479
+ def _on_window_restored(self):
480
+ self._ensure_window_chrome()
481
+ self._refresh_client_layout()
482
+
483
+ def _ensure_window_chrome(self, delay: float = 0.08):
484
+ if not self._defer_window_chrome:
485
+ return
486
+
487
+ self._defer_window_chrome = False
488
+ native = getattr(self._window, "native", None)
489
+ if native is None:
490
+ return
491
+
492
+ def _apply():
493
+ try:
494
+ hwnd = int(native.Handle.ToInt64())
495
+ _apply_menu_theme_support(self.values.get("system_theme"), hwnd)
496
+ if self._startup_cloaked:
497
+ window_dwm.toggle_cloak(hwnd, False)
498
+ self._startup_cloaked = False
499
+ try:
500
+ title_bar.unhide(hwnd)
501
+ except Exception:
502
+ pass
503
+ title_bar.hide(hwnd)
504
+ self._set_window_maximized_state(bool(_user32.IsZoomed(hwnd)), sync=False)
505
+ except Exception:
506
+ core_logger.debug("Failed to ensure window chrome", exc_info=True)
507
+
508
+ self._invoke_native_later(native, _apply, delay)
509
+
510
+ def _refresh_client_layout(self, delay: float = 0.08):
511
+ native = getattr(self._window, "native", None)
512
+ if native is None:
513
+ return
514
+
515
+ forms = importlib.import_module("System.Windows.Forms")
516
+
517
+ def _apply():
518
+ try:
519
+ native.SuspendLayout()
520
+ webview_control = getattr(native, "webview", None)
521
+ if webview_control is not None:
522
+ webview_control.Dock = forms.DockStyle.Fill
523
+ webview_control.Bounds = native.ClientRectangle
524
+ webview_control.BringToFront()
525
+ webview_control.Invalidate()
526
+ webview_control.Update()
527
+ native.PerformLayout()
528
+ native.Invalidate(True)
529
+ native.Refresh()
530
+ except Exception:
531
+ core_logger.debug("Failed to refresh client layout", exc_info=True)
532
+ finally:
533
+ try:
534
+ native.ResumeLayout(True)
535
+ except Exception:
536
+ pass
537
+
538
+ self._invoke_native_later(native, _apply, delay)
539
+
540
+ def _show_window(self):
541
+ native = getattr(self._window, "native", None)
542
+ if native is None:
543
+ self._window.show()
544
+ else:
545
+ self._invoke_native_sync(native, self._window.show)
546
+ self._ensure_window_chrome()
547
+ self._refresh_client_layout()
548
+
549
+ def _restore_window(self):
550
+ native = getattr(self._window, "native", None)
551
+ if native is None:
552
+ self._window.restore()
553
+ else:
554
+ self._invoke_native_sync(native, self._window.restore)
555
+ self._ensure_window_chrome()
556
+ self._refresh_client_layout()
557
+
558
+ def _hide_window(self):
559
+ native = getattr(self._window, "native", None)
560
+ if native is None:
561
+ self._window.hide()
562
+ return
563
+ self._invoke_native_sync(native, self._window.hide)
564
+
565
+ def _destroy_window(self):
566
+ native = getattr(self._window, "native", None)
567
+ if native is None:
568
+ self._window.destroy()
569
+ return
570
+ self._invoke_native_sync(native, self._window.destroy)
571
+
572
+ def _minimize_window(self):
573
+ native = getattr(self._window, "native", None)
574
+ if native is None:
575
+ self._window.minimize()
576
+ return
577
+ self._invoke_native_sync(native, self._window.minimize)
578
+
579
+ def _on_closing(self, *_):
580
+ return not self.events.closing.set()
581
+
445
582
  def _on_closed(self):
446
583
  self.accent.stop()
447
584
  self._stop_ui_server()
448
585
  self.events.closed.set()
449
586
 
450
- def _dispatch_or_defer_sync(self, key: str, value):
451
- with self._sync_lock:
452
- if not self._frontend_ready:
453
- self._pending_sync[key] = value
454
- return
455
-
456
- self._dispatch_sync_value(key, value)
457
-
458
587
  def _dispatch_sync_value(self, key: str, value):
459
588
  if key == "system_title":
460
589
  try:
@@ -471,7 +600,12 @@ class MainWindow:
471
600
  core_logger.debug("Failed to sync value %s", key, exc_info=True)
472
601
 
473
602
  def queue_sync_value(self, key: str, value):
474
- self._dispatch_or_defer_sync(key, value)
603
+ with self._sync_lock:
604
+ if not self._frontend_ready:
605
+ self._pending_sync[key] = value
606
+ return
607
+
608
+ self._dispatch_sync_value(key, value)
475
609
 
476
610
  def _set_window_maximized_state(self, value: bool, *, sync: bool = True):
477
611
  value = bool(value)
@@ -518,15 +652,10 @@ class MainWindow:
518
652
  self._window.on_top = state
519
653
  return
520
654
 
521
- action_type = getattr(importlib.import_module("System"), "Action")
522
-
523
655
  def _apply():
524
656
  self._window.on_top = state
525
657
 
526
- if native.InvokeRequired:
527
- native.BeginInvoke(action_type(_apply))
528
- else:
529
- _apply()
658
+ self._invoke_native(native, _apply)
530
659
  except Exception:
531
660
  core_logger.debug("Failed to set window on top", exc_info=True)
532
661
 
@@ -536,17 +665,12 @@ class MainWindow:
536
665
  if native is None:
537
666
  return
538
667
 
539
- action_type = getattr(importlib.import_module("System"), "Action")
540
-
541
668
  def _apply():
542
669
  hwnd = int(native.Handle.ToInt64())
543
670
  _user32.ReleaseCapture()
544
671
  _user32.SendMessageW(hwnd, 0x00A1, 2, 0) # WM_NCLBUTTONDOWN, HTCAPTION
545
672
 
546
- if native.InvokeRequired:
547
- native.BeginInvoke(action_type(_apply))
548
- else:
549
- _apply()
673
+ self._invoke_native(native, _apply)
550
674
  except Exception:
551
675
  core_logger.debug("Failed to start system window drag", exc_info=True)
552
676
 
@@ -556,18 +680,13 @@ class MainWindow:
556
680
  if native is None:
557
681
  return
558
682
 
559
- action_type = getattr(importlib.import_module("System"), "Action")
560
-
561
683
  def _apply():
562
684
  hwnd = int(native.Handle.ToInt64())
563
685
  is_zoomed = bool(_user32.IsZoomed(hwnd))
564
686
  command = 9 if is_zoomed else 3 # SW_RESTORE / SW_MAXIMIZE
565
687
  _user32.ShowWindow(hwnd, command)
566
688
 
567
- if native.InvokeRequired:
568
- native.BeginInvoke(action_type(_apply))
569
- else:
570
- _apply()
689
+ self._invoke_native(native, _apply)
571
690
  except Exception:
572
691
  core_logger.debug("Failed to toggle window maximize", exc_info=True)
573
692
 
@@ -577,8 +696,6 @@ class MainWindow:
577
696
  if native is None:
578
697
  return
579
698
 
580
- action_type = getattr(importlib.import_module("System"), "Action")
581
-
582
699
  def _apply():
583
700
  hwnd = int(native.Handle.ToInt64())
584
701
  menu = _user32.GetSystemMenu(hwnd, False)
@@ -604,10 +721,7 @@ class MainWindow:
604
721
  _user32.PostMessageW(hwnd, 0x0112, command, 0) # WM_SYSCOMMAND
605
722
  _user32.PostMessageW(hwnd, 0x0000, 0, 0) # WM_NULL
606
723
 
607
- if native.InvokeRequired:
608
- native.BeginInvoke(action_type(_apply))
609
- else:
610
- _apply()
724
+ self._invoke_native(native, _apply)
611
725
  except Exception:
612
726
  core_logger.debug("Failed to show window system menu", exc_info=True)
613
727
 
@@ -663,6 +777,7 @@ class MainWindow:
663
777
  debug: bool = False,
664
778
  *,
665
779
  hidden: bool = False,
780
+ minimized: bool = False,
666
781
  on_top: bool | None = None,
667
782
  width: int | None = None,
668
783
  height: int | None = None,
@@ -673,7 +788,9 @@ class MainWindow:
673
788
  self._minimum_width = max(1, int(min_width))
674
789
  self._minimum_height = max(1, int(min_height))
675
790
  self._window.min_size = (self._minimum_width, self._minimum_height)
791
+ self._defer_window_chrome = bool(hidden or minimized)
676
792
  self._window.hidden = bool(hidden)
793
+ self._window.minimized = bool(minimized and not hidden)
677
794
 
678
795
  if width is not None and height is not None:
679
796
  width = max(self._minimum_width, int(width))
@@ -12,11 +12,13 @@ class Event:
12
12
  self.items: list[Callable[..., Any]] = []
13
13
 
14
14
  def set(self, *args: Any):
15
+ result = False
15
16
  for func in tuple(self.items):
16
17
  try:
17
- func(*args)
18
+ result = bool(func(*args)) or result
18
19
  except Exception:
19
20
  logger.exception("Event callback failed")
21
+ return result
20
22
 
21
23
  def _add(self, item: Callable[..., Any]):
22
24
  self.items.append(item)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes