meltygui 0.1.2__tar.gz → 0.1.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 (579) hide show
  1. {meltygui-0.1.2 → meltygui-0.1.3}/.gitignore +1 -1
  2. {meltygui-0.1.2 → meltygui-0.1.3}/PKG-INFO +6 -3
  3. {meltygui-0.1.2 → meltygui-0.1.3}/README.md +4 -2
  4. {meltygui-0.1.2 → meltygui-0.1.3}/docs/DEVELOPMENT.md +20 -4
  5. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/cache/mask_batch.py +16 -4
  6. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/cache/tile_cache.py +79 -45
  7. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/overlay_renderer.py +6 -2
  8. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/screenshot.py +3 -2
  9. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/melty.py +22 -8
  10. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/app.py +71 -7
  11. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/services/terminal_core.py +4 -1
  12. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/styling/fonts.py +31 -14
  13. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/glfw_utils.py +14 -1
  14. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/os_frame.py +20 -12
  15. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/surface.py +16 -11
  16. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/titlebar.py +49 -3
  17. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/shader_compiler.py +9 -3
  18. {meltygui-0.1.2 → meltygui-0.1.3}/pyproject.toml +2 -2
  19. {meltygui-0.1.2 → meltygui-0.1.3}/tests/conftest.py +2 -2
  20. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_app_exit_flush.py +10 -2
  21. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_chat_main.py +4 -1
  22. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_definition_relocation.py +2 -3
  23. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_file_rows_overlay.py +4 -2
  24. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_file_type_codecs.py +3 -3
  25. meltygui-0.1.3/tests/test_font_backing_scale.py +69 -0
  26. meltygui-0.1.3/tests/test_native_collision_fallback.py +125 -0
  27. meltygui-0.1.3/tests/test_native_collision_surface.py +118 -0
  28. meltygui-0.1.3/tests/test_native_live_resize.py +143 -0
  29. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_native_windows.py +2 -1
  30. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_os_frame.py +3 -1
  31. meltygui-0.1.3/tests/test_retina_tile_capture.py +78 -0
  32. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_shadow_capture_gl.py +17 -9
  33. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_texture_overlay.py +24 -0
  34. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_voxel_ownership.py +5 -2
  35. {meltygui-0.1.2 → meltygui-0.1.3}/LICENSE +0 -0
  36. {meltygui-0.1.2 → meltygui-0.1.3}/docs/APPS.md +0 -0
  37. {meltygui-0.1.2 → meltygui-0.1.3}/docs/INPUT_RECORDING.md +0 -0
  38. {meltygui-0.1.2 → meltygui-0.1.3}/docs/PUBLISHING.md +0 -0
  39. {meltygui-0.1.2 → meltygui-0.1.3}/docs/SUPPORT_WHEELS.md +0 -0
  40. {meltygui-0.1.2 → meltygui-0.1.3}/examples/render_overlay.py +0 -0
  41. {meltygui-0.1.2 → meltygui-0.1.3}/examples/tensor_live.py +0 -0
  42. {meltygui-0.1.2 → meltygui-0.1.3}/examples/tile_manager.py +0 -0
  43. {meltygui-0.1.2 → meltygui-0.1.3}/examples/tile_sibling_links.py +0 -0
  44. {meltygui-0.1.2 → meltygui-0.1.3}/examples/voxel_playground.py +0 -0
  45. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/__init__.py +0 -0
  46. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/accounts/__init__.py +0 -0
  47. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/accounts/internet_accounts.py +0 -0
  48. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/__init__.py +0 -0
  49. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/__main__.py +0 -0
  50. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/activity.py +0 -0
  51. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/assets/source-icons/LICENSE +0 -0
  52. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/assets/source-icons/README.md +0 -0
  53. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/assets/source-icons/claude.png +0 -0
  54. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/assets/source-icons/claude.svg +0 -0
  55. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/assets/source-icons/codex.png +0 -0
  56. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/assets/source-icons/codex.svg +0 -0
  57. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/auto_titles.py +0 -0
  58. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/backends.py +0 -0
  59. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/chat_interface.py +0 -0
  60. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/chat_proxy.py +0 -0
  61. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/chat_service.py +0 -0
  62. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/claude_code.py +0 -0
  63. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/codex_proxy.py +0 -0
  64. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/codex_settings.py +0 -0
  65. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/codex_transport.py +0 -0
  66. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/command_parser.py +0 -0
  67. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/images.py +0 -0
  68. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/main.py +0 -0
  69. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/messages.py +0 -0
  70. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/metadata.py +0 -0
  71. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/writer_locks.py +0 -0
  72. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/__init__.py +0 -0
  73. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/basic_converters.py +0 -0
  74. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/chain_converters.py +0 -0
  75. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/code_checks.py +0 -0
  76. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/codec_registry.py +0 -0
  77. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/core_syntax.py +0 -0
  78. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/file_converters.py +0 -0
  79. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/fileref.py +0 -0
  80. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/hotswap_guard.py +0 -0
  81. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/libcst_conversion.py +0 -0
  82. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/live_instrument.py +0 -0
  83. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/live_view.py +0 -0
  84. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/melty_scan.py +0 -0
  85. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/new_codecs.py +0 -0
  86. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/new_converters.py +0 -0
  87. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/project_code.py +0 -0
  88. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/source_context.py +0 -0
  89. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/symbol_roster.py +0 -0
  90. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/syntax_check.py +0 -0
  91. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/syntax_check_worker.py +0 -0
  92. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/__init__.py +0 -0
  93. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/fim.py +0 -0
  94. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/fim_context.py +0 -0
  95. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/__init__.py +0 -0
  96. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/anthropic_oauth.py +0 -0
  97. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/anthropic_requests.py +0 -0
  98. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/claude.py +0 -0
  99. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/claude_usage.py +0 -0
  100. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/codex_accounts.py +0 -0
  101. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/copilot.py +0 -0
  102. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/oauth_popup.py +0 -0
  103. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/ollama.py +0 -0
  104. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/profiles.py +0 -0
  105. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/README.md +0 -0
  106. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/__init__.py +0 -0
  107. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/__init__.py +0 -0
  108. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/action_core.py +0 -0
  109. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/collection_action.py +0 -0
  110. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/input_recording_core.py +0 -0
  111. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/input_replay.py +0 -0
  112. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/mcp_eval.py +0 -0
  113. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/mcp_hotswap.py +0 -0
  114. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/mcp_query.py +0 -0
  115. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/mcp_server.py +0 -0
  116. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/orchestration_core.py +0 -0
  117. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/query_core.py +0 -0
  118. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/search_core.py +0 -0
  119. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/selector_core.py +0 -0
  120. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/value_core.py +0 -0
  121. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/cache/__init__.py +0 -0
  122. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/cache/cache_diagnostics.py +0 -0
  123. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/cache/invalidation_decoration.py +0 -0
  124. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/cache/invalidation_tracker.py +0 -0
  125. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/cache/parameter_dependencies.py +0 -0
  126. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/cache/tile_marks.py +0 -0
  127. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/__init__.py +0 -0
  128. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/bubbling.py +0 -0
  129. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/cache_tree.py +0 -0
  130. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/chain.py +0 -0
  131. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/converter_register.py +0 -0
  132. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/data_decoration.py +0 -0
  133. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/dict_conversion.py +0 -0
  134. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/dict_conversion_util.py +0 -0
  135. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/dynamic_obj.py +0 -0
  136. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/graph_compare.py +0 -0
  137. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/load_save_v2.py +0 -0
  138. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/missing_saved_class.py +0 -0
  139. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/path_finder.py +0 -0
  140. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/render_host.py +0 -0
  141. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/core_render.py +0 -0
  142. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/definition_hotswap.py +0 -0
  143. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/__init__.py +0 -0
  144. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/attribute_churn.py +0 -0
  145. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/edge_motion_guard.py +0 -0
  146. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/fps_counter.py +0 -0
  147. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/geometry_jitter.py +0 -0
  148. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/gpu_frame_timer.py +0 -0
  149. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/inspection_core.py +0 -0
  150. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/monitor_core.py +0 -0
  151. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/notifications.py +0 -0
  152. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/perf_trace.py +0 -0
  153. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/profile_decoration.py +0 -0
  154. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/resize_trace.py +0 -0
  155. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/screenshot_core.py +0 -0
  156. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/session_status.py +0 -0
  157. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/trace_core.py +0 -0
  158. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/files/__init__.py +0 -0
  159. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/files/file_core.py +0 -0
  160. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/files/file_explorer_core.py +0 -0
  161. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/files/file_tree_core.py +0 -0
  162. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/files/file_watch_core.py +0 -0
  163. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/files/import_graph_core.py +0 -0
  164. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/files/metadata_core.py +0 -0
  165. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/files/path_icons.py +0 -0
  166. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/__init__.py +0 -0
  167. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/cuda_context_core.py +0 -0
  168. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/cuda_interop_core.py +0 -0
  169. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/cuda_kernel_core.py +0 -0
  170. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/framebuffer_recorder.py +0 -0
  171. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/gl_state.py +0 -0
  172. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/lut_core.py +0 -0
  173. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/scene_target.py +0 -0
  174. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/shader_func.py +0 -0
  175. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/tensor_core.py +0 -0
  176. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/text_texture.py +0 -0
  177. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/wayland_color.py +0 -0
  178. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/__init__.py +0 -0
  179. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/collision.py +0 -0
  180. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/drag_drop_core.py +0 -0
  181. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/hypr_left_drag.py +0 -0
  182. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/input_core.py +0 -0
  183. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/input_handler.py +0 -0
  184. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/mouse_cursor.py +0 -0
  185. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/pynput_backend.py +0 -0
  186. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/space_mouse.py +0 -0
  187. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/touchpad_backend.py +0 -0
  188. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/view_selection.py +0 -0
  189. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/__init__.py +0 -0
  190. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/column_core.py +0 -0
  191. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/cursor_core.py +0 -0
  192. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/dropdown_core.py +0 -0
  193. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/edge_constraints.py +0 -0
  194. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/grid_core.py +0 -0
  195. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/header_core.py +0 -0
  196. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/header_runtime.py +0 -0
  197. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/layout_core.py +0 -0
  198. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/tile_links.py +0 -0
  199. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/tile_manager_core.py +0 -0
  200. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/tile_resize.py +0 -0
  201. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/module_map.json +0 -0
  202. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/module_names.py +0 -0
  203. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/__init__.py +0 -0
  204. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/core_decoration.py +0 -0
  205. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/core_render_helpers.py +0 -0
  206. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/fast_view.py +0 -0
  207. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/func_metadata.py +0 -0
  208. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/injected_state.py +0 -0
  209. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/mode.py +0 -0
  210. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/mode_defaults.py +0 -0
  211. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/modes.py +0 -0
  212. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/overlay.py +0 -0
  213. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/parameter_core.py +0 -0
  214. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/render_dispatch.py +0 -0
  215. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/render_funcs.py +0 -0
  216. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/shaped.py +0 -0
  217. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/view_identity.py +0 -0
  218. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/window_decoration.py +0 -0
  219. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/__init__.py +0 -0
  220. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/app_session.py +0 -0
  221. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/app_settings.py +0 -0
  222. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/background.py +0 -0
  223. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/extensions.py +0 -0
  224. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/gc_manager.py +0 -0
  225. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/launch_override.py +0 -0
  226. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/lifecycle.py +0 -0
  227. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/paths.py +0 -0
  228. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/settings.py +0 -0
  229. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/singleton.py +0 -0
  230. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/thread_safe_bool.py +0 -0
  231. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/thread_signal.py +0 -0
  232. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/toggles.py +0 -0
  233. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/services/__init__.py +0 -0
  234. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/services/account_core.py +0 -0
  235. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/services/chat_core.py +0 -0
  236. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/services/claude_terminal_core.py +0 -0
  237. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/services/terminal_runtime.py +0 -0
  238. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/styling/__init__.py +0 -0
  239. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/styling/color_core.py +0 -0
  240. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/styling/global_style.py +0 -0
  241. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/styling/style.py +0 -0
  242. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/styling/style_core.py +0 -0
  243. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/styling/warm_start.py +0 -0
  244. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/__init__.py +0 -0
  245. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/backends/PYIMGUI_LICENSE +0 -0
  246. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/backends/__init__.py +0 -0
  247. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/backends/imgui_renderer.py +0 -0
  248. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/backends/native_wayland.py +0 -0
  249. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/backends/protocols/xdg-decoration-unstable-v1.xml +0 -0
  250. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/backends/protocols/xdg-shell.xml +0 -0
  251. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/backends/wayland_protocol.py +0 -0
  252. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/dock_core.py +0 -0
  253. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/frame_geometry.py +0 -0
  254. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/geometry_feed.py +0 -0
  255. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/titlebar_buttons.py +0 -0
  256. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/wayland_move.py +0 -0
  257. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/window_api.py +0 -0
  258. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/window_constants.py +0 -0
  259. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/window_visibility.py +0 -0
  260. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/debug/__init__.py +0 -0
  261. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/debug/app_view_utils.py +0 -0
  262. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/__init__.py +0 -0
  263. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/bash_syntax.py +0 -0
  264. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/code_line_fast.py +0 -0
  265. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/diff.py +0 -0
  266. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/external_changes.py +0 -0
  267. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/file_header.py +0 -0
  268. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/live_usage.py +0 -0
  269. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/live_view_views.py +0 -0
  270. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/pending_save.py +0 -0
  271. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/roster_tints.py +0 -0
  272. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/source_preview.py +0 -0
  273. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/source_tools.py +0 -0
  274. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/source_ui.py +0 -0
  275. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/spell_check.py +0 -0
  276. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/text_editor.py +0 -0
  277. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/usage_picker.py +0 -0
  278. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/events/__init__.py +0 -0
  279. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/events/example.py +0 -0
  280. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/__init__.py +0 -0
  281. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/columns_demo.py +0 -0
  282. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/columns_window_demo.py +0 -0
  283. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/context_menu_demo.py +0 -0
  284. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/context_menu_window_demo.py +0 -0
  285. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/gui_playground.py +0 -0
  286. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/live_view_playground.py +0 -0
  287. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/lora.py +0 -0
  288. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/lora_data.py +0 -0
  289. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/lora_policies.py +0 -0
  290. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/mode_demo.py +0 -0
  291. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/modifies_demo.py +0 -0
  292. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/scalar_policies.py +0 -0
  293. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/settings_demo.py +0 -0
  294. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/style_layouts.py +0 -0
  295. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/tile_manager_demo.py +0 -0
  296. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/tint_demo.py +0 -0
  297. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/tint_functions.py +0 -0
  298. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/trace_demo.py +0 -0
  299. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/two_windows.py +0 -0
  300. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/voxel_transfer_paths.py +0 -0
  301. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/files/__init__.py +0 -0
  302. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/files/fast_file_explorer.py +0 -0
  303. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/gnome_extension/lsd-window-geometry@latent-descent/extension.js +0 -0
  304. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/gnome_extension/lsd-window-geometry@latent-descent/lsd-window-geometry@latent-descent.iml +0 -0
  305. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/gnome_extension/lsd-window-geometry@latent-descent/metadata.json +0 -0
  306. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/__init__.py +0 -0
  307. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/base.py +0 -0
  308. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/examples.py +0 -0
  309. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/executor.py +0 -0
  310. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/filter.py +0 -0
  311. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/filter.pyi +0 -0
  312. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/generate_stubs.py +0 -0
  313. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/registry.py +0 -0
  314. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/shaders.py +0 -0
  315. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/stub_generator.py +0 -0
  316. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/texture_min_max.py +0 -0
  317. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/hdr_color.py +0 -0
  318. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/image_load.py +0 -0
  319. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/__init__.py +0 -0
  320. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/account_model.py +0 -0
  321. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/breakpoint_model.py +0 -0
  322. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/camera_model.py +0 -0
  323. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/chat_folder_model.py +0 -0
  324. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/chat_model.py +0 -0
  325. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/code_dict_model.py +0 -0
  326. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/code_model.py +0 -0
  327. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/code_proxy_model.py +0 -0
  328. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/collection_model.py +0 -0
  329. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/color_model.py +0 -0
  330. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/cuda_buffer_model.py +0 -0
  331. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/cuda_tensor_model.py +0 -0
  332. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/cuda_texture_model.py +0 -0
  333. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/dropdown_model.py +0 -0
  334. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/file_location_model.py +0 -0
  335. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/file_metadata_model.py +0 -0
  336. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/file_model.py +0 -0
  337. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/folder_icon_model.py +0 -0
  338. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/format_model.py +0 -0
  339. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/graph_model.py +0 -0
  340. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/icon_model.py +0 -0
  341. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/import_graph_model.py +0 -0
  342. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/input_recording_model.py +0 -0
  343. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/layout_model.py +0 -0
  344. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/lut_model.py +0 -0
  345. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/search_model.py +0 -0
  346. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/source_snapshot_model.py +0 -0
  347. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/tensor_model.py +0 -0
  348. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/terminal_model.py +0 -0
  349. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/texture_model.py +0 -0
  350. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/tile_model.py +0 -0
  351. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/trace_model.py +0 -0
  352. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/trace_report_model.py +0 -0
  353. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/models/__init__.py +0 -0
  354. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/models/file_meta.py +0 -0
  355. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/models/function_console.py +0 -0
  356. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/models/orchestration.py +0 -0
  357. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/pbr.py +0 -0
  358. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/png_unfilter.c +0 -0
  359. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/JetBrainsMono-Regular.ttf +0 -0
  360. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/THIRD_PARTY_NOTICES.md +0 -0
  361. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/dejavu/DejaVuSans-Bold.ttf +0 -0
  362. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/dejavu/DejaVuSans-ExtraLight.ttf +0 -0
  363. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/dejavu/DejaVuSans.ttf +0 -0
  364. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/dejavu/LICENSE.txt +0 -0
  365. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/fontawesome-LICENSE.txt +0 -0
  366. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/fontawesome-webfont.ttf +0 -0
  367. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/hdri/studio_small_09_1k.hdr +0 -0
  368. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/jetbrains-weights/JetBrainsMono-Bold.ttf +0 -0
  369. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraBold.ttf +0 -0
  370. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraLight.ttf +0 -0
  371. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/jetbrains-weights/JetBrainsMono-Light.ttf +0 -0
  372. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/jetbrains-weights/JetBrainsMono-Medium.ttf +0 -0
  373. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/jetbrains-weights/JetBrainsMono-SemiBold.ttf +0 -0
  374. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/jetbrains-weights/JetBrainsMono-Thin.ttf +0 -0
  375. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/jetbrains-weights/OFL.txt +0 -0
  376. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/jetbrains-weights/README.md +0 -0
  377. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/__init__.py +0 -0
  378. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/account_state.py +0 -0
  379. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/animation_state.py +0 -0
  380. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/annotation_state.py +0 -0
  381. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/chat_state.py +0 -0
  382. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/code_state.py +0 -0
  383. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/core_enums.py +0 -0
  384. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/core_markers.py +0 -0
  385. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/core_undo.py +0 -0
  386. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/file_state.py +0 -0
  387. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/graph_state.py +0 -0
  388. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/inspection_state.py +0 -0
  389. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/menu_state.py +0 -0
  390. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/model_enums.py +0 -0
  391. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/new_core_model.py +0 -0
  392. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/orchestration_state.py +0 -0
  393. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/path_icon_state.py +0 -0
  394. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/query_state.py +0 -0
  395. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/tensor_state.py +0 -0
  396. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/terminal_state.py +0 -0
  397. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/texture_state.py +0 -0
  398. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/trace_state.py +0 -0
  399. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/view_reference.py +0 -0
  400. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/voxel_state.py +0 -0
  401. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/text_index.py +0 -0
  402. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/utils/__init__.py +0 -0
  403. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/utils/jump_to_code.py +0 -0
  404. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/utils/pkl_inspect.py +0 -0
  405. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/utils/render_utils.py +0 -0
  406. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/__init__.py +0 -0
  407. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/account_view.py +0 -0
  408. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/action_view.py +0 -0
  409. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/chat_decoration_view.py +0 -0
  410. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/chat_sidebar_view.py +0 -0
  411. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/chat_source_icon_view.py +0 -0
  412. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/chat_view.py +0 -0
  413. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/code_view.py +0 -0
  414. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/collection_view.py +0 -0
  415. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/color_view.py +0 -0
  416. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/control_view.py +0 -0
  417. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/decoration_view.py +0 -0
  418. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/diagnostic_view.py +0 -0
  419. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/dropdown_view.py +0 -0
  420. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/file_icon_view.py +0 -0
  421. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/file_view.py +0 -0
  422. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/graph_cuda_view.py +0 -0
  423. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/graph_view.py +0 -0
  424. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/header_view.py +0 -0
  425. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/input_recording_view.py +0 -0
  426. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/input_view.py +0 -0
  427. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/inspection_view.py +0 -0
  428. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/layout_view.py +0 -0
  429. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/lut_view.py +0 -0
  430. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/menu_view.py +0 -0
  431. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/orchestration_view.py +0 -0
  432. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/path_icon_view.py +0 -0
  433. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/query_view.py +0 -0
  434. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/search_view.py +0 -0
  435. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/tab_view.py +0 -0
  436. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/tensor_view.py +0 -0
  437. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/terminal_view.py +0 -0
  438. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/text_view.py +0 -0
  439. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/texture_view.py +0 -0
  440. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/tile_view.py +0 -0
  441. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/trace_view.py +0 -0
  442. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/voxel_cuda_view.py +0 -0
  443. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/voxel_view.py +0 -0
  444. {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/window_view.py +0 -0
  445. {meltygui-0.1.2 → meltygui-0.1.3}/tests/fixtures/terminal_before_runtime.py +0 -0
  446. {meltygui-0.1.2 → meltygui-0.1.3}/tests/profile_render_wrapper.py +0 -0
  447. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_app_settings.py +0 -0
  448. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_background_palette.py +0 -0
  449. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_breakpoint_model.py +0 -0
  450. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_cached_input_delivery.py +0 -0
  451. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_capture_passes.py +0 -0
  452. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_chat_auto_titles.py +0 -0
  453. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_chat_claude_code.py +0 -0
  454. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_chat_codex_fast.py +0 -0
  455. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_chat_messages.py +0 -0
  456. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_chat_presentation.py +0 -0
  457. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_chat_service.py +0 -0
  458. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_chat_token_usage.py +0 -0
  459. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_chat_turn_status.py +0 -0
  460. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_child_surface_cache_keepalive.py +0 -0
  461. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_clean_surface_skip.py +0 -0
  462. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_click_disambiguation.py +0 -0
  463. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_code_dict.py +0 -0
  464. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_code_dict_scenarios.py +0 -0
  465. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_column_edge_solve.py +0 -0
  466. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_column_frame_fit.py +0 -0
  467. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_column_maxes.py +0 -0
  468. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_column_right_drag_display_wall.py +0 -0
  469. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_context_menu_placement.py +0 -0
  470. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_control_paint.py +0 -0
  471. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_core_relocation.py +0 -0
  472. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_core_syntax.py +0 -0
  473. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_crash_report_store.py +0 -0
  474. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_cuda_context_core.py +0 -0
  475. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_cuda_direct_lines.py +0 -0
  476. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_cuda_image_interop.py +0 -0
  477. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_cuda_interop.py +0 -0
  478. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_cuda_interop_core.py +0 -0
  479. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_cuda_kernel_core.py +0 -0
  480. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_cuda_march.py +0 -0
  481. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_deferred_view_returns.py +0 -0
  482. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_draw_state_parent_geometry.py +0 -0
  483. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_dropdown_divider.py +0 -0
  484. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_edge_graph_solve.py +0 -0
  485. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_edge_motion_guard.py +0 -0
  486. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_fast_draw_collection.py +0 -0
  487. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_fast_draw_dropdown.py +0 -0
  488. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_fast_menu_bar.py +0 -0
  489. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_file_metadata_model.py +0 -0
  490. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_file_model.py +0 -0
  491. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_file_watch_limits.py +0 -0
  492. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_file_watch_start.py +0 -0
  493. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_folder_icons.py +0 -0
  494. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_fps_counter.py +0 -0
  495. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_frame_geometry_hotswap.py +0 -0
  496. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_freeze_scrollbar_overlay.py +0 -0
  497. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_fstring_highlight.py +0 -0
  498. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_function_console.py +0 -0
  499. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_geometry_feed_grace.py +0 -0
  500. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_geometry_jitter.py +0 -0
  501. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_glfw_window_app_name.py +0 -0
  502. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_glfw_window_editable_root.py +0 -0
  503. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_gpu_frame_timer.py +0 -0
  504. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_hdr_color.py +0 -0
  505. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_held_input.py +0 -0
  506. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_hotswap_preserves_runtime_state.py +0 -0
  507. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_image_texture.py +0 -0
  508. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_import_boundary.py +0 -0
  509. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_initial_child_placement.py +0 -0
  510. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_input_recording.py +0 -0
  511. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_live_class_apply.py +0 -0
  512. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_live_function_apply.py +0 -0
  513. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_live_store_owner.py +0 -0
  514. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_lut_model.py +0 -0
  515. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_mask_batch.py +0 -0
  516. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_native_background_drag.py +0 -0
  517. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_native_body_cursor.py +0 -0
  518. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_native_frame_contacts.py +0 -0
  519. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_native_resize_workarea.py +0 -0
  520. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_nested_layout_right_drag.py +0 -0
  521. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_overlay_submission_state.py +0 -0
  522. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_package_contract.py +0 -0
  523. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_path_icon_view.py +0 -0
  524. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_pending_signature_lint.py +0 -0
  525. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_public_boundary.py +0 -0
  526. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_readme_examples.py +0 -0
  527. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_recent_files.py +0 -0
  528. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_recompile_import_backfill.py +0 -0
  529. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_release_workflow.py +0 -0
  530. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_render_background.py +0 -0
  531. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_render_change_notification.py +0 -0
  532. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_render_context_injection.py +0 -0
  533. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_render_func_integration.py +0 -0
  534. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_render_host_surface_drag.py +0 -0
  535. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_render_overlay.py +0 -0
  536. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_restored_resource_ownership.py +0 -0
  537. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_row_edge_solve.py +0 -0
  538. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_saved_renderer_recovery.py +0 -0
  539. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_search_symbol_tables.py +0 -0
  540. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_shader_func.py +0 -0
  541. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_shaped.py +0 -0
  542. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_source_site_keys.py +0 -0
  543. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_startup_imports.py +0 -0
  544. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_surface_body_resize.py +0 -0
  545. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_syntax_check_worker.py +0 -0
  546. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_tensor_controls.py +0 -0
  547. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_tensor_model.py +0 -0
  548. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_tensor_slices.py +0 -0
  549. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_terminal_live_migration.py +0 -0
  550. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_terminal_ownership.py +0 -0
  551. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_text_texture_contexts.py +0 -0
  552. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_tile_frame_reuse.py +0 -0
  553. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_tile_hotswap_content.py +0 -0
  554. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_tile_links.py +0 -0
  555. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_tile_manager.py +0 -0
  556. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_tile_resize_replay.py +0 -0
  557. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_toggles_color.py +0 -0
  558. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_typing_incremental_layout.py +0 -0
  559. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_unmanaged_window_frames.py +0 -0
  560. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_view_icon_locate.py +0 -0
  561. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_view_identity.py +0 -0
  562. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_voxel_backends.py +0 -0
  563. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_voxel_roll_gl.py +0 -0
  564. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_window_call_state.py +0 -0
  565. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_window_collision_investigation.py +0 -0
  566. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_window_comment_overrides.py +0 -0
  567. {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_windows_portability.py +0 -0
  568. {meltygui-0.1.2 → meltygui-0.1.3}/tests/untitled.py +0 -0
  569. {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/build.py +0 -0
  570. {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/build_in_container.sh +0 -0
  571. {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/licenses/NVIDIA-CUDA-12.1-EULA.txt +0 -0
  572. {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/licenses/boost.txt +0 -0
  573. {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/licenses/imgui-MIT.txt +0 -0
  574. {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/licenses/imstb_rectpack.h.license.txt +0 -0
  575. {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/licenses/imstb_textedit.h.license.txt +0 -0
  576. {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/licenses/imstb_truetype.h.license.txt +0 -0
  577. {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/prepare.py +0 -0
  578. {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/rewrite_imports.py +0 -0
  579. {meltygui-0.1.2 → meltygui-0.1.3}/tools/release.py +0 -0
@@ -6,5 +6,5 @@ dist/
6
6
  build/
7
7
  *.egg-info/
8
8
  .melty/
9
-
9
+ .DS_Store
10
10
  .idea/
@@ -1,10 +1,11 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: meltygui
3
- Version: 0.1.2
3
+ Version: 0.1.3
4
4
  Summary: Immediate-mode Python UI, live inspection, HDR and tensor visualization
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE
7
7
  Classifier: Development Status :: 3 - Alpha
8
+ Classifier: Operating System :: MacOS :: MacOS X
8
9
  Classifier: Operating System :: Microsoft :: Windows
9
10
  Classifier: Operating System :: POSIX :: Linux
10
11
  Classifier: Programming Language :: Python :: 3.11
@@ -60,11 +61,13 @@ MeltyGUI is capable of rendering tensors exceeding 64GB in size. The primary cha
60
61
  MeltyGUI is not yet published to PyPI. For now, install from a checkout using
61
62
  [the setup guide](docs/DEVELOPMENT.md#setup).
62
63
 
63
- The current setup targets Linux x86-64 with Python 3.11, 3.12 or 3.13 and a
64
- working OpenGL 4.3 context. CUDA tensor rendering also requires PyTorch, an
64
+ Linux x86-64 uses Python 3.11, 3.12 or 3.13 and OpenGL 4.3. The UI and editor
65
+ also run on Apple Silicon macOS with Python 3.12, OpenGL 4.1 and Retina
66
+ rendering. CUDA tensor rendering requires PyTorch, an
65
67
  NVIDIA GPU, a CUDA toolkit, and MeltyGUI's GL-enabled CUDA binding. The native
66
68
  bindings install as prebuilt wheels on those targets; elsewhere installers
67
69
  compile them, see [when no wheel matches](docs/SUPPORT_WHEELS.md#when-no-wheel-matches).
70
+ CUDA rendering is unavailable on macOS.
68
71
 
69
72
  ## Visualize a tensor
70
73
 
@@ -13,11 +13,13 @@ MeltyGUI is capable of rendering tensors exceeding 64GB in size. The primary cha
13
13
  MeltyGUI is not yet published to PyPI. For now, install from a checkout using
14
14
  [the setup guide](docs/DEVELOPMENT.md#setup).
15
15
 
16
- The current setup targets Linux x86-64 with Python 3.11, 3.12 or 3.13 and a
17
- working OpenGL 4.3 context. CUDA tensor rendering also requires PyTorch, an
16
+ Linux x86-64 uses Python 3.11, 3.12 or 3.13 and OpenGL 4.3. The UI and editor
17
+ also run on Apple Silicon macOS with Python 3.12, OpenGL 4.1 and Retina
18
+ rendering. CUDA tensor rendering requires PyTorch, an
18
19
  NVIDIA GPU, a CUDA toolkit, and MeltyGUI's GL-enabled CUDA binding. The native
19
20
  bindings install as prebuilt wheels on those targets; elsewhere installers
20
21
  compile them, see [when no wheel matches](docs/SUPPORT_WHEELS.md#when-no-wheel-matches).
22
+ CUDA rendering is unavailable on macOS.
21
23
 
22
24
  ## Visualize a tensor
23
25
 
@@ -7,16 +7,25 @@ remaining migration work and deliberate deferrals.
7
7
 
8
8
  ## Setup
9
9
 
10
- Supported targets are Linux x86-64 with CPython 3.11, 3.12 or 3.13 and a working
11
- OpenGL 4.3 context. MeltyGUI itself is not on PyPI yet, so install it from a
12
- checkout; its native support packages (`meltygui-imgui`, `meltygui-pycuda`) come
13
- from PyPI as prebuilt wheels:
10
+ Linux x86-64 uses CPython 3.11, 3.12 or 3.13 and OpenGL 4.3. macOS on Apple
11
+ Silicon is tested with CPython 3.12 and Apple's OpenGL 4.1 core context,
12
+ including Retina font atlases and cached tiles. CUDA rendering requires an
13
+ NVIDIA system and is unavailable on macOS.
14
+
15
+ MeltyGUI itself is not on PyPI yet, so install it from a checkout. Native
16
+ support packages come from PyPI; `meltygui-imgui` builds from source on macOS
17
+ when no matching wheel is available, using Xcode Command Line Tools:
14
18
 
15
19
  ```sh
16
20
  uv venv --python 3.12
17
21
  uv pip install --python .venv/bin/python -e . --group dev
18
22
  ```
19
23
 
24
+ On macOS, install `uv` with `brew install uv` if needed. Install Xcode Command
25
+ Line Tools with `xcode-select --install` if they are not already available.
26
+ The first native ImGui build can take a few minutes. No local `dist/release`
27
+ directory is required.
28
+
20
29
  To use MeltyGUI from another project, add the checkout as a path dependency:
21
30
 
22
31
  ```sh
@@ -65,6 +74,13 @@ python3 tools/torch_matrix.py --window-smoke # also opens the README example:
65
74
  Run apps with the environment's Python. The native Wayland and GLFW backends
66
75
  share the same render functions.
67
76
 
77
+ macOS native resizing redraws through GLFW's window-refresh callback while
78
+ Cocoa holds the event loop. The app only permits those frames during its OS
79
+ event dispatch, restores the interrupted window's graphics contexts, and
80
+ defers recursive refreshes and native window creation/destruction to the loop.
81
+ When checking this path, drag the actual window border: programmatic size
82
+ changes alone do not exercise Cocoa's live-resize loop.
83
+
68
84
  ```sh
69
85
  .venv/bin/pytest
70
86
  .venv/bin/python examples/tensor_live.py
@@ -92,6 +92,7 @@ def batches(stamps):
92
92
  class MaskBatch:
93
93
  def __init__(self):
94
94
  self.program = self.vao = self.vbo = None
95
+ self.flat_texture = None
95
96
  self.source = None
96
97
  self.multi_bind = False
97
98
  self.fb_location = self.textures_location = None
@@ -103,6 +104,9 @@ class MaskBatch:
103
104
  gl.glDeleteBuffers(1, [self.vbo])
104
105
  if self.vao is not None:
105
106
  gl.glDeleteVertexArrays(1, [self.vao])
107
+ if getattr(self, 'flat_texture', None) is not None:
108
+ gl.glDeleteTextures([self.flat_texture])
109
+ self.flat_texture = None
106
110
  self.program = self.vao = self.vbo = None
107
111
  self.source = None
108
112
 
@@ -155,10 +159,18 @@ class MaskBatch:
155
159
  gl.glBufferData(gl.GL_ARRAY_BUFFER, len(data), data, gl.GL_STREAM_DRAW)
156
160
  first_instance = 0
157
161
  for textures, data, count in packed:
158
- # Populate unused slots with a valid source, avoiding feedback
159
- # from a texture attached to the current framebuffer. Zero is
160
- # bound to GL_TEXTURE_2D explicitly (bulk zero unbinds ALL targets).
161
- bank = textures + [textures[0]] * (TEXTURES_PER_BATCH - len(textures)) if textures else [0] * TEXTURES_PER_BATCH
162
+ # Apple requires complete samplers even for the flat branch.
163
+ # Own a tiny source for that case; never sample the destination.
164
+ if not textures and self.flat_texture is None:
165
+ self.flat_texture = int(gl.glGenTextures(1))
166
+ gl.glActiveTexture(gl.GL_TEXTURE0)
167
+ gl.glBindTexture(gl.GL_TEXTURE_2D, self.flat_texture)
168
+ gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_NEAREST)
169
+ gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)
170
+ gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA8, 1, 1, 0,
171
+ gl.GL_RGBA, gl.GL_UNSIGNED_BYTE, bytes(4))
172
+ bank = (textures + [textures[0]] * (TEXTURES_PER_BATCH - len(textures))
173
+ if textures else [self.flat_texture] * TEXTURES_PER_BATCH)
162
174
  if self.multi_bind and textures:
163
175
  gl.glBindTextures(0, TEXTURES_PER_BATCH, bank)
164
176
  else:
@@ -130,6 +130,19 @@ def _tile_alloc(t) -> Tuple[int, int]:
130
130
  return getattr(t, "alloc_size", None) or t.size
131
131
 
132
132
 
133
+ def _pixel_rect(rect, scale):
134
+ """Window-point bounds to integer texel bounds, including fractional DPI."""
135
+ x, y, w, h = rect
136
+ sx, sy = scale
137
+ left, bottom = snap_int(x * sx), snap_int(y * sy)
138
+ return left, bottom, snap_int((x + w) * sx) - left, snap_int((y + h) * sy) - bottom
139
+
140
+
141
+ def _tile_pixel_size(tile, *, allocated=False):
142
+ size = _tile_alloc(tile) if allocated else tile.size
143
+ return _pixel_rect((0, 0, *size), tile.pixel_scale)[2:]
144
+
145
+
133
146
  def _tile_uv_rect(t) -> Tuple[float, float, float, float]:
134
147
  """uUVRect (xy scale, zw offset) mapping a 0..1 dest-rect UV onto the
135
148
  top-anchored logical subrect of a bucket-padded tile texture."""
@@ -150,7 +163,8 @@ class Tile:
150
163
  mask_tex: int # Cached subtree mask for this tile
151
164
  rbo: Optional[int]
152
165
  size: Tuple[int, int] # LOGICAL view size; the texture may be larger (alloc_size)
153
- alloc_size: Optional[Tuple[int, int]] = None # bucketed texture dims, None = same as size
166
+ alloc_size: Optional[Tuple[int, int]] = None # bucketed window-point dims, None = same as size
167
+ pixel_scale: Tuple[float, float] = (1.0, 1.0) # physical texels per window point
154
168
  dirty: bool = True
155
169
  last_clean_frame: int = -1
156
170
  last_invalidated_frame: int = 3
@@ -364,7 +378,8 @@ def _clear_mask_regions(mask_tex: int, rects) -> None:
364
378
  gl.glClear(gl.GL_COLOR_BUFFER_BIT)
365
379
 
366
380
 
367
- def _ensure_tile(existing: Optional[Tile], w: int, h: int, frame_id: int = 0, draw_state=None, tile_id=None) -> \
381
+ def _ensure_tile(existing: Optional[Tile], w: int, h: int, frame_id: int = 0, draw_state=None, tile_id=None,
382
+ pixel_scale=(1.0, 1.0)) -> \
368
383
  Optional[Tile]:
369
384
  # Layout occasionally hands us fractional or negative dims (e.g. a
370
385
  # midline is 0.333... width). glTexImage2D coerces those to int and lands on
@@ -374,7 +389,8 @@ def _ensure_tile(existing: Optional[Tile], w: int, h: int, frame_id: int = 0, dr
374
389
  h = int(h) if h and h > 0 else 0
375
390
  if w <= 0 or h <= 0:
376
391
  return None
377
- if existing and existing.size == (w, h):
392
+ same_scale = existing is not None and existing.pixel_scale == pixel_scale
393
+ if same_scale and existing.size == (w, h):
378
394
  return existing
379
395
 
380
396
  aw = _bucket(w)
@@ -390,7 +406,7 @@ def _ensure_tile(existing: Optional[Tile], w: int, h: int, frame_id: int = 0, dr
390
406
  aw = max(aw, snap_int(eaw))
391
407
  ah = max(ah, snap_int(eah))
392
408
 
393
- if existing and _tile_alloc(existing) == (aw, ah):
409
+ if same_scale and _tile_alloc(existing) == (aw, ah):
394
410
  # Same bucket: update the logical size in place - no GL realloc, no
395
411
  # crop-blit (top-anchored content keeps the screen-top-left corner on
396
412
  # the same texels). Returning the SAME object is the caller's signal
@@ -424,6 +440,7 @@ def _ensure_tile(existing: Optional[Tile], w: int, h: int, frame_id: int = 0, dr
424
440
  # one) would leave stale G/B/A inside the new logical rect.
425
441
  gl.glColorMask(gl.GL_TRUE, gl.GL_TRUE, gl.GL_TRUE, gl.GL_TRUE)
426
442
  gl.glClearColor(0, 0, 0, 0.0)
443
+ bands = [_pixel_rect(rect, pixel_scale) for rect in bands]
427
444
  for x, y, cw, ch in bands:
428
445
  gl.glScissor(int(x), int(y), int(cw), int(ch))
429
446
  gl.glClear(gl.GL_COLOR_BUFFER_BIT)
@@ -480,7 +497,8 @@ def _ensure_tile(existing: Optional[Tile], w: int, h: int, frame_id: int = 0, dr
480
497
  except Exception:
481
498
  pass
482
499
  try:
483
- new_tex = _create_color_tex(aw, ah)
500
+ pixel_aw, pixel_ah = _pixel_rect((0, 0, aw, ah), pixel_scale)[2:]
501
+ new_tex = _create_color_tex(pixel_aw, pixel_ah)
484
502
  except Exception as e:
485
503
  existing_size = existing.size if existing else None
486
504
  reset = "\033[0m"
@@ -490,13 +508,13 @@ def _ensure_tile(existing: Optional[Tile], w: int, h: int, frame_id: int = 0, dr
490
508
  f"\nCurrent size {existing_size}\n{'=' * 10}{reset}")
491
509
  return None
492
510
 
493
- new_mask_tex = _create_mask_tex(aw, ah)
511
+ new_mask_tex = _create_mask_tex(pixel_aw, pixel_ah)
494
512
  # No depth-stencil renderbuffer: tiles are only ever written by the PASS 3
495
513
  # copy shader and the crop-blit, neither of which depth/stencil-tests, and
496
514
  # the D24S8 attachment was 4 B/px of VRAM plus the slowest part of the
497
515
  # create/destroy/delete cycle. Tile.rbo stays None; the guarded delete
498
516
  # sites will free RBOs on tiles created before this change.
499
- new_fbo, new_rbo = _create_fbo_with_tex(new_tex, False, aw, ah)
517
+ new_fbo, new_rbo = _create_fbo_with_tex(new_tex, False, pixel_aw, pixel_ah)
500
518
 
501
519
  if existing:
502
520
  st = _GLState()
@@ -533,13 +551,15 @@ def _ensure_tile(existing: Optional[Tile], w: int, h: int, frame_id: int = 0, dr
533
551
  cw = max(0, min(ow, w))
534
552
  ch = max(0, min(oh, h))
535
553
  if cw > 0 and ch > 0:
554
+ src_x, src_y, src_w, src_h = _pixel_rect((0, old_ah - ch, cw, ch), existing.pixel_scale)
555
+ dst_x, dst_y, dst_w, dst_h = _pixel_rect((0, ah - ch, cw, ch), pixel_scale)
536
556
  gl.glBlitFramebuffer(
537
- 0, snap_int(old_ah) - ch, cw, snap_int(old_ah), # src (old FBO, top-left in screen)
538
- 0, ah - ch, cw, ah, # dst (new FBO, same screen corner)
557
+ src_x, src_y, src_x + src_w, src_y + src_h,
558
+ dst_x, dst_y, dst_x + dst_w, dst_y + dst_h,
539
559
  gl.GL_COLOR_BUFFER_BIT,
540
560
  gl.GL_NEAREST, # No scaling -> NEAREST is exact and cheap
541
561
  )
542
- _clear_mask_regions(new_mask_tex, [(0, 0, aw, ah)])
562
+ _clear_mask_regions(new_mask_tex, [(0, 0, pixel_aw, pixel_ah)])
543
563
  finally:
544
564
  st.restore()
545
565
 
@@ -562,12 +582,12 @@ def _ensure_tile(existing: Optional[Tile], w: int, h: int, frame_id: int = 0, dr
562
582
  gl.glColorMask(gl.GL_TRUE, gl.GL_TRUE, gl.GL_TRUE, gl.GL_TRUE)
563
583
  gl.glClearColor(0, 0, 0, 0.0)
564
584
  gl.glClear(gl.GL_COLOR_BUFFER_BIT)
565
- _clear_mask_regions(new_mask_tex, [(0, 0, aw, ah)])
585
+ _clear_mask_regions(new_mask_tex, [(0, 0, pixel_aw, pixel_ah)])
566
586
  finally:
567
587
  st.restore()
568
588
 
569
589
  t = Tile(draw_state=draw_state, fbo=new_fbo, tex=new_tex, mask_tex=new_mask_tex, rbo=new_rbo, size=(w, h),
570
- alloc_size=(aw, ah), dirty=True)
590
+ alloc_size=(aw, ah), pixel_scale=pixel_scale, dirty=True)
571
591
  # Seed filled_bbox to what the crop-copy above covered (in tile-local
572
592
  # top-left coords). On a shrink it's the whole tile -> tile reads are fully
573
593
  # covered and the scroll-invalidate gate stops early; on a grow it's
@@ -1194,6 +1214,9 @@ void main() { oColor = uColor; }
1194
1214
  # Main class
1195
1215
  # ==============================
1196
1216
  class TileCacheMasked:
1217
+ # Existing live caches acquire per-window backing scale on their next
1218
+ # frame after a hotswap; unscaled caches retain their previous behavior.
1219
+ _pixel_scale = (1.0, 1.0)
1197
1220
  def __init__(self):
1198
1221
  self.initial_value = {}
1199
1222
  self.did_deviate = {}
@@ -1260,6 +1283,7 @@ class TileCacheMasked:
1260
1283
  self.all_keys = set()
1261
1284
 
1262
1285
  self._fb_size: Tuple[int, int] = (0, 0)
1286
+ self._pixel_scale = (1.0, 1.0)
1263
1287
  # Allocated dims of the four co-sized internal surfaces (_mask,
1264
1288
  # _sub_mask, _full_sub_mask, snapshot). For monitor only, grow-only.
1265
1289
  # _fb_size stays the LOGICAL framebuffer size everywhere.
@@ -1537,10 +1561,10 @@ class TileCacheMasked:
1537
1561
  fl, ft, fr, fb = t.filled_bbox
1538
1562
  return fl > vl + 0.5 or ft > vt + 0.5 or fr < vr - 0.5 or fb < vb - 0.5
1539
1563
 
1540
- @staticmethod
1541
- def _oversized(size: Optional[Tuple[int, int]]) -> bool:
1564
+ def _oversized(self, size: Optional[Tuple[int, int]]) -> bool:
1542
1565
  """True if a view this size is too large to back with an offscreen tile."""
1543
- return size is not None and (size[0] > MAX_TILE_DIM or size[1] > MAX_TILE_DIM)
1566
+ return size is not None and (size[0] * self._pixel_scale[0] > MAX_TILE_DIM
1567
+ or size[1] * self._pixel_scale[1] > MAX_TILE_DIM)
1544
1568
 
1545
1569
  def _discard_tile(self, key: str) -> None:
1546
1570
  """Drop a tile and free its GL resources (e.g. a view grew too large to cache)."""
@@ -2245,8 +2269,13 @@ class TileCacheMasked:
2245
2269
  key = self.key_to_parent_key.get(key)
2246
2270
  self._resize_input_keys = keys
2247
2271
 
2248
- def mask_begin_frame(self, framebuffer_size: Tuple[int, int]) -> None:
2272
+ def mask_begin_frame(self, framebuffer_size: Tuple[int, int], pixel_scale=None) -> None:
2249
2273
  fb_w, fb_h = map(int, framebuffer_size)
2274
+ if pixel_scale is not None and tuple(pixel_scale) != getattr(self, '_pixel_scale', (1.0, 1.0)):
2275
+ self._pixel_scale = tuple(pixel_scale)
2276
+ # A move between displays changes the backing resolution once.
2277
+ # Wake cached ancestors as well as leaves so every tile recaptures.
2278
+ self.invalidate_all(other_windows=False)
2250
2279
  self._note_frame_stats()
2251
2280
  self._refresh_resize_input_keys()
2252
2281
  self._frame_id += 1
@@ -3186,7 +3215,7 @@ class TileCacheMasked:
3186
3215
  (ix0, iy0, ix1 - ix0, iy1 - iy0),
3187
3216
  (d_and_l[0] * rank_scale, d_and_l[1] * rank_scale,
3188
3217
  d_and_l[2] * rank_scale, d_and_l[3] * rank_scale,
3189
- cr if cr > 0 else 0.0, margin))
3218
+ max(0.0, cr) * s_x, margin * s_x))
3190
3219
  _, ix0, iy0, ix1, iy1, own_clip, _owner, inset, rect4, tail6 = base
3191
3220
  if ix1 <= ix0 or iy1 <= iy0:
3192
3221
  continue
@@ -3222,8 +3251,9 @@ class TileCacheMasked:
3222
3251
  gl.glUseProgram(self._prog_shadow_batch)
3223
3252
  _win_tex = getattr(self, "_win_mask_tex", None)
3224
3253
  gl.glActiveTexture(gl.GL_TEXTURE1)
3225
- gl.glBindTexture(gl.GL_TEXTURE_2D,
3226
- _win_tex if (win_gate and _win_tex) else 0)
3254
+ # WinZ=1 disables occlusion for tile bakes. The sampler still
3255
+ # needs a complete texture on Apple even when that branch is off.
3256
+ gl.glBindTexture(gl.GL_TEXTURE_2D, _win_tex or 0)
3227
3257
  gl.glActiveTexture(gl.GL_TEXTURE0)
3228
3258
  gl.glUniform1i(self._loc_sb_uWinMask, 1)
3229
3259
  gl.glUniform2f(self._loc_sb_uFBSize,
@@ -3313,8 +3343,7 @@ class TileCacheMasked:
3313
3343
  gl.glUseProgram(self._prog_shadow_grad)
3314
3344
  _win_tex = getattr(self, "_win_mask_tex", None)
3315
3345
  gl.glActiveTexture(gl.GL_TEXTURE1)
3316
- gl.glBindTexture(gl.GL_TEXTURE_2D,
3317
- _win_tex if (win_gate and _win_tex) else 0)
3346
+ gl.glBindTexture(gl.GL_TEXTURE_2D, _win_tex or 0)
3318
3347
  gl.glActiveTexture(gl.GL_TEXTURE0)
3319
3348
  gl.glUniform1i(self._loc_sg_uWinMask, 1)
3320
3349
  _fbw, _fbh = self._fb_size
@@ -3431,8 +3460,8 @@ class TileCacheMasked:
3431
3460
  float(d_and_l[2]) / 65535.5,
3432
3461
  float(d_and_l[3]) / 65535.5)
3433
3462
  gl.glUniform2f(self._loc_sg_uRectSize, float(iw), float(ih))
3434
- gl.glUniform1f(self._loc_sg_uCornerRadius, max(0.0, cr))
3435
- gl.glUniform1f(self._loc_sg_uMargin, margin)
3463
+ gl.glUniform1f(self._loc_sg_uCornerRadius, max(0.0, cr) * s_x)
3464
+ gl.glUniform1f(self._loc_sg_uMargin, margin * s_x)
3436
3465
  gl.glDrawArrays(gl.GL_TRIANGLES, 0, 3)
3437
3466
  gl.glDisable(gl.GL_SCISSOR_TEST)
3438
3467
  gl.glBlendEquation(gl.GL_FUNC_ADD)
@@ -3505,7 +3534,7 @@ class TileCacheMasked:
3505
3534
  gl.glUniform2f(self._loc_maskr_uRectSize, float(iw), float(ih))
3506
3535
  gl.glUniform1f(self._loc_maskr_uCornerRadius,
3507
3536
  max(0.0, float(getattr(wds, "corner_radius", 6.0)
3508
- or 0.0)))
3537
+ or 0.0)) * s_x)
3509
3538
  gl.glDrawArrays(gl.GL_TRIANGLES, 0, 3)
3510
3539
  gl.glColorMask(gl.GL_TRUE, gl.GL_TRUE, gl.GL_TRUE, gl.GL_TRUE)
3511
3540
 
@@ -3726,10 +3755,10 @@ class TileCacheMasked:
3726
3755
  right texels, and fb_h is the REAL height for the y flip."""
3727
3756
  dd = imgui.get_draw_data()
3728
3757
  dp_x, dp_y = dd.display_pos
3729
- s_x, s_y = 1, 1
3758
+ s_x, s_y = imgui.get_io().display_fb_scale
3730
3759
  ox, oy = getattr(Melty, "frame_origin", None) or (0, 0)
3731
- dp_x -= int(ox)
3732
- dp_y -= int(oy)
3760
+ dp_x -= int(ox) / s_x
3761
+ dp_y -= int(oy) / s_y
3733
3762
  real = getattr(Melty, "framebuffer_size", None)
3734
3763
  if real:
3735
3764
  fb_w, fb_h = snap_int(real[0]), snap_int(real[1])
@@ -3841,7 +3870,8 @@ class TileCacheMasked:
3841
3870
  if key in getattr(self, '_resize_input_keys', ()):
3842
3871
  return False
3843
3872
  tile = self._tiles.get(key)
3844
- if tile is None or not tile.tex or tile.last_clean_frame < 0:
3873
+ if (tile is None or not tile.tex or tile.last_clean_frame < 0
3874
+ or tile.pixel_scale != self._pixel_scale):
3845
3875
  return False
3846
3876
  if key in self._frozen_served:
3847
3877
  return True
@@ -4149,6 +4179,7 @@ class TileCacheMasked:
4149
4179
  bands.append((0, ah - ch, cw, ch - h))
4150
4180
  if cw > w: # right band: screen cols [w, cw), full content height
4151
4181
  bands.append((w, ah - ch, cw - w, ch))
4182
+ bands = [_pixel_rect(rect, t.pixel_scale) for rect in bands]
4152
4183
  st = _GLState()
4153
4184
  try:
4154
4185
  gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, t.fbo)
@@ -4257,6 +4288,7 @@ class TileCacheMasked:
4257
4288
  if t is not None and getattr(t, 'content_stale', False):
4258
4289
  self._scrub_stale_content(t, draw_state)
4259
4290
  use_image = (t and has_area
4291
+ and t.pixel_scale == self._pixel_scale
4260
4292
  and (t.size == (size[0], size[1]))
4261
4293
  and (not self._is_dirty(t))
4262
4294
  and (not draw_state.size_change))
@@ -4276,6 +4308,7 @@ class TileCacheMasked:
4276
4308
  dragging = Melty.resize_gesture_live()
4277
4309
  frozen = False
4278
4310
  if (draw_state.freeze_resize and t is not None and has_area and dragging
4311
+ and t.pixel_scale == self._pixel_scale
4279
4312
  and rkey not in getattr(self, '_resize_input_keys', ())
4280
4313
  and (t.size != (size[0], size[1])
4281
4314
  or Melty.resize_press_frame == Melty.frame_count
@@ -4600,7 +4633,8 @@ class TileCacheMasked:
4600
4633
  and not imgui.is_mouse_down(1) and not imgui.is_mouse_down(2)
4601
4634
  and not Melty.space_mouse_drag):
4602
4635
  old_t = t
4603
- t = _ensure_tile(t, ctx.size[0], ctx.size[1], frame_id=self._frame_id, draw_state=ctx.draw_state)
4636
+ t = _ensure_tile(t, ctx.size[0], ctx.size[1], frame_id=self._frame_id,
4637
+ draw_state=ctx.draw_state, pixel_scale=self._pixel_scale)
4604
4638
 
4605
4639
  if t is not None and t is old_t:
4606
4640
  # Within-bucket logical resize: the tile was updated in
@@ -4854,8 +4888,8 @@ class TileCacheMasked:
4854
4888
  gl.glUseProgram(self._prog_mask_rounded)
4855
4889
  gl.glUniform1f(self._loc_maskr_uRankNorm, rank_norm)
4856
4890
  gl.glUniform2f(self._loc_maskr_uRectSize, float(iw), float(ih))
4857
- gl.glUniform1f(self._loc_maskr_uCornerRadius, r.corner_radius)
4858
- gl.glUniform1f(self._loc_maskr_uMargin, shadow_margin)
4891
+ gl.glUniform1f(self._loc_maskr_uCornerRadius, r.corner_radius * s_x)
4892
+ gl.glUniform1f(self._loc_maskr_uMargin, shadow_margin * s_x)
4859
4893
 
4860
4894
  else:
4861
4895
  gl.glUseProgram(self._prog_mask)
@@ -4920,15 +4954,15 @@ class TileCacheMasked:
4920
4954
  gl.glBindTexture(gl.GL_TEXTURE_2D, t.mask_tex)
4921
4955
  gl.glUniform1i(self._loc_texr_uTex, 0)
4922
4956
  gl.glUniform2f(self._loc_texr_uRectSize, float(iw), float(ih))
4923
- gl.glUniform1f(self._loc_texr_uCornerRadius, r.corner_radius)
4924
- gl.glUniform1f(self._loc_texr_uMargin, shadow_margin)
4957
+ gl.glUniform1f(self._loc_texr_uCornerRadius, r.corner_radius * s_x)
4958
+ gl.glUniform1f(self._loc_texr_uMargin, shadow_margin * s_x)
4925
4959
 
4926
4960
  else:
4927
4961
  gl.glUseProgram(self._prog_mask_rounded)
4928
4962
  gl.glUniform1f(self._loc_maskr_uRankNorm, float(r.layer) * INV_65535)
4929
4963
  gl.glUniform2f(self._loc_maskr_uRectSize, float(iw), float(ih))
4930
- gl.glUniform1f(self._loc_maskr_uCornerRadius, r.corner_radius)
4931
- gl.glUniform1f(self._loc_maskr_uMargin, shadow_margin)
4964
+ gl.glUniform1f(self._loc_maskr_uCornerRadius, r.corner_radius * s_x)
4965
+ gl.glUniform1f(self._loc_maskr_uMargin, shadow_margin * s_x)
4932
4966
 
4933
4967
  gl.glDrawArrays(gl.GL_TRIANGLES, 0, 3)
4934
4968
 
@@ -5122,8 +5156,8 @@ class TileCacheMasked:
5122
5156
  gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, p.tile.fbo)
5123
5157
  # Write into the top-anchored logical subrect of the
5124
5158
  # (possibly bucket-padded) texture.
5125
- t_lw, t_lh = snap_int(p.tile.size[0]), snap_int(p.tile.size[1])
5126
- t_ah = snap_int(_tile_alloc(p.tile)[1])
5159
+ t_lw, t_lh = _tile_pixel_size(p.tile)
5160
+ t_ah = _tile_pixel_size(p.tile, allocated=True)[1]
5127
5161
  gl.glViewport(0, t_ah - t_lh, t_lw, t_lh)
5128
5162
 
5129
5163
  # Pre-tint: multiplicative blending drifts stale pixels toward blue
@@ -5341,8 +5375,8 @@ class TileCacheMasked:
5341
5375
  iw,
5342
5376
  ih,
5343
5377
  offset,
5344
- r.corner_radius,
5345
- r.draw_state.shadow_margin if r.draw_state is not None else 0.0,
5378
+ r.corner_radius * s_x,
5379
+ r.draw_state.shadow_margin * s_x if r.draw_state is not None else 0.0,
5346
5380
  uv_rect=_tile_uv_rect(t_child),
5347
5381
  )
5348
5382
  else:
@@ -5357,9 +5391,9 @@ class TileCacheMasked:
5357
5391
  gl.glUseProgram(self._prog_mask_rounded)
5358
5392
  gl.glUniform1f(self._loc_maskr_uRankNorm, rank_norm)
5359
5393
  gl.glUniform2f(self._loc_maskr_uRectSize, float(iw), float(ih))
5360
- gl.glUniform1f(self._loc_maskr_uCornerRadius, r.corner_radius)
5394
+ gl.glUniform1f(self._loc_maskr_uCornerRadius, r.corner_radius * s_x)
5361
5395
  shadow_margin = r.draw_state.shadow_margin if r.draw_state is not None else 0.0
5362
- gl.glUniform1f(self._loc_maskr_uMargin, shadow_margin)
5396
+ gl.glUniform1f(self._loc_maskr_uMargin, shadow_margin * s_x)
5363
5397
 
5364
5398
  else:
5365
5399
  gl.glUseProgram(self._prog_mask)
@@ -5402,8 +5436,8 @@ class TileCacheMasked:
5402
5436
 
5403
5437
  # Dst is the top-anchored logical subrect of the (possibly
5404
5438
  # bucket-ized) mask texture, mirroring PASS 3's viewport.
5405
- m_lw, m_lh = int(p.tile.size[0]), int(p.tile.size[1])
5406
- m_ah = int(_tile_alloc(p.tile)[1])
5439
+ m_lw, m_lh = _tile_pixel_size(p.tile)
5440
+ m_ah = _tile_pixel_size(p.tile, allocated=True)[1]
5407
5441
  gl.glBlitFramebuffer(
5408
5442
  int(x0),
5409
5443
  int(y0),
@@ -5488,13 +5522,13 @@ class TileCacheMasked:
5488
5522
 
5489
5523
  mask_stamps.append((t.mask_tex, (ix0, iy0, iw, ih),
5490
5524
  (clip_ix0, clip_iy0, clip_iw, clip_ih),
5491
- _tile_uv_rect(t), offset, r.corner_radius, shadow_margin))
5525
+ _tile_uv_rect(t), offset, r.corner_radius * s_x, shadow_margin * s_x))
5492
5526
  else:
5493
5527
  clip = (clip_ix0, clip_iy0, clip_iw, clip_ih)
5494
5528
  shadow_margin = r.draw_state.shadow_margin if r.draw_state is not None else 0.0
5495
5529
  mask_stamps.append((None, clip, clip, (1, 1, 0, 0),
5496
5530
  float(depth_and_layer) / 65535.5,
5497
- r.corner_radius, shadow_margin))
5531
+ r.corner_radius * s_x, shadow_margin * s_x))
5498
5532
 
5499
5533
  if getattr(self, "_mask_batch", None) is None:
5500
5534
  from meltygui.core.cache.mask_batch import MaskBatch
@@ -829,7 +829,8 @@ class SplitOverlayRenderer(WindowRenderer):
829
829
  from OpenGL.GL import shaders
830
830
  return shaders.compileProgram(
831
831
  shaders.compileShader(self._STYLE_CONTEXT_VERT, gl.GL_VERTEX_SHADER),
832
- shaders.compileShader(self._STYLE_CONTEXT_FRAG, gl.GL_FRAGMENT_SHADER))
832
+ shaders.compileShader(self._STYLE_CONTEXT_FRAG, gl.GL_FRAGMENT_SHADER),
833
+ validate=False) # The VAO is constructed below, after linking.
833
834
  program = self._style_gl.get('style_context_program', build_program, gl.glDeleteProgram)
834
835
 
835
836
  def build_vao():
@@ -880,7 +881,10 @@ class SplitOverlayRenderer(WindowRenderer):
880
881
  """Texture unit 1 = StyleContext for the whole command render."""
881
882
  gl.glActiveTexture(gl.GL_TEXTURE1)
882
883
  previous = int(gl.glGetIntegerv(gl.GL_TEXTURE_BINDING_2D))
883
- gl.glBindTexture(gl.GL_TEXTURE_2D, int(texture_id))
884
+ # Even an unused sampler must name a complete texture on Apple's
885
+ # driver. The atlas is already resident; DynamicStyles=0 prevents
886
+ # sampling it as a background when no context texture is needed.
887
+ gl.glBindTexture(gl.GL_TEXTURE_2D, int(texture_id or self.io.fonts.texture_id))
884
888
  gl.glActiveTexture(gl.GL_TEXTURE0)
885
889
  return previous
886
890
 
@@ -396,6 +396,7 @@ def _capture_tile(name):
396
396
  import OpenGL.GL as gl
397
397
  from PIL import Image
398
398
  from meltygui.core.melty import Melty
399
+ from meltygui.core.cache.tile_cache import _tile_pixel_size
399
400
 
400
401
  mw = _find_window(name)
401
402
  if mw is None:
@@ -409,7 +410,7 @@ def _capture_tile(name):
409
410
  tile = tiles.get(tile_id)
410
411
  if tile is None:
411
412
  return None
412
- w, h = tile.size
413
+ w, h = _tile_pixel_size(tile)
413
414
  if not w or not h or tile.fbo in (None, -1):
414
415
  return None
415
416
 
@@ -418,7 +419,7 @@ def _capture_tile(name):
418
419
  gl.glPixelStorei(gl.GL_PACK_ALIGNMENT, 1)
419
420
  # Content is top-anchored in a possibly bottom-padded texture: the logical
420
421
  # w x h pixels live in the texture rows [alloc_h - h, alloc_h), not at y=0.
421
- alloc_h = (getattr(tile, "alloc_size", None) or tile.size)[1]
422
+ alloc_h = _tile_pixel_size(tile, allocated=True)[1]
422
423
  # Tiles hold LINEAR scRGB (fp16, hdr_color.py): read floats and sRGB-encode
423
424
  # for the PNG the way the presentation pass does for the screen.
424
425
  data = gl.glReadPixels(0, int(alloc_h) - int(h), int(w), int(h), gl.GL_RGBA, gl.GL_FLOAT)
@@ -613,10 +613,19 @@ class FileWatch:
613
613
  return cls._self_write_text.get(resolved)
614
614
 
615
615
  @classmethod
616
- def shutdown(cls):
616
+ def stop(cls):
617
+ """Join native file callbacks before the Python runtime goes away.
618
+
619
+ Standalone apps own their save policy and need this resource cleanup
620
+ without importing the code stack or flushing edits from a failed frame.
621
+ """
622
+ cls.observer.stop()
617
623
  if cls.observer.is_alive():
618
- cls.observer.stop()
619
624
  cls.observer.join()
625
+
626
+ @classmethod
627
+ def shutdown(cls):
628
+ cls.stop()
620
629
  from meltygui.code.libcst_conversion import shutdown_jedi_pool
621
630
  from meltygui.code.libcst_conversion import shutdown_symbol_index_daemon
622
631
  shutdown_jedi_pool()
@@ -2300,8 +2309,13 @@ class Melty:
2300
2309
 
2301
2310
  if cls.font_mgr is None:
2302
2311
  return
2303
- if cls.font_mgr.scale != cls.ui_scale:
2304
- if not cls.font_mgr.rebuild(cls.ui_scale, impl):
2312
+ io = imgui.get_io()
2313
+ # Surfaces share one atlas. Keep the highest backing density seen so
2314
+ # windows on different displays cannot continually rebuild each other.
2315
+ pixel_scale = max(cls.font_mgr.pixel_scale, *io.display_fb_scale)
2316
+ io.font_global_scale = 1.0 / pixel_scale
2317
+ if cls.font_mgr.scale != cls.ui_scale or cls.font_mgr.pixel_scale != pixel_scale:
2318
+ if not cls.font_mgr.rebuild(cls.ui_scale, impl, pixel_scale=pixel_scale):
2305
2319
  return
2306
2320
  # Lazy fonts: bake whatever last-frame's get()s queued (fonts
2307
2321
  # are seeded minimally at boot - see FontManager.prewarm). Same
@@ -2965,7 +2979,7 @@ class Melty:
2965
2979
  cls.display_size = (fb_w, fb_h)
2966
2980
  # Masks/tiles cover the WHOLE framebuffer (shadow margin included).
2967
2981
  real_fb = cls.framebuffer_size or (fb_w, fb_h)
2968
- cls.cache.mask_begin_frame((int(real_fb[0]), int(real_fb[1])))
2982
+ cls.cache.mask_begin_frame((int(real_fb[0]), int(real_fb[1])), imgui.get_io().display_fb_scale)
2969
2983
 
2970
2984
  # Channel-split the foreground/overlay draw list the same way as the
2971
2985
  # window draw list (max_depth channels) so per-window overlays can be
@@ -5058,8 +5072,8 @@ class Melty:
5058
5072
  # Glow rects as light sources: hand the composite the low-res
5059
5073
  # glow buffer (add_glow marks, stamped in finalize_captures
5060
5074
  # PASS 6). glow_strength=0 skips the path in the shader, so an
5061
- # empty/absent glow costs nothing; texture 0 is a legal
5062
- # placeholder bind for the sampler in that case.
5075
+ # empty/absent glow costs nothing. Still bind a complete
5076
+ # texture for Apple's driver, even when the branch is off.
5063
5077
  _glow_tex = (Melty.cache.glow_tex
5064
5078
  if Melty.cache.glow_active else None)
5065
5079
  _glow_on = _glow_tex is not None and Toggles.glow
@@ -5083,7 +5097,7 @@ class Melty:
5083
5097
  shadow_size=(float(composite_shadow_size[0]),
5084
5098
  float(composite_shadow_size[1])),
5085
5099
  depth_sharpness=float(Toggles.shadow_edge_sharpness),
5086
- glow_map=_glow_tex if _glow_on else 0,
5100
+ glow_map=_glow_tex if _glow_on else shadow_raw,
5087
5101
  glow_strength=(float(Toggles.glow_strength)
5088
5102
  if _glow_on else 0.0),
5089
5103
  glow_shadow_cut=float(Toggles.glow_shadow_cut),