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.
- {meltygui-0.1.2 → meltygui-0.1.3}/.gitignore +1 -1
- {meltygui-0.1.2 → meltygui-0.1.3}/PKG-INFO +6 -3
- {meltygui-0.1.2 → meltygui-0.1.3}/README.md +4 -2
- {meltygui-0.1.2 → meltygui-0.1.3}/docs/DEVELOPMENT.md +20 -4
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/cache/mask_batch.py +16 -4
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/cache/tile_cache.py +79 -45
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/overlay_renderer.py +6 -2
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/screenshot.py +3 -2
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/melty.py +22 -8
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/app.py +71 -7
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/services/terminal_core.py +4 -1
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/styling/fonts.py +31 -14
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/glfw_utils.py +14 -1
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/os_frame.py +20 -12
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/surface.py +16 -11
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/titlebar.py +49 -3
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/shader_compiler.py +9 -3
- {meltygui-0.1.2 → meltygui-0.1.3}/pyproject.toml +2 -2
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/conftest.py +2 -2
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_app_exit_flush.py +10 -2
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_chat_main.py +4 -1
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_definition_relocation.py +2 -3
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_file_rows_overlay.py +4 -2
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_file_type_codecs.py +3 -3
- meltygui-0.1.3/tests/test_font_backing_scale.py +69 -0
- meltygui-0.1.3/tests/test_native_collision_fallback.py +125 -0
- meltygui-0.1.3/tests/test_native_collision_surface.py +118 -0
- meltygui-0.1.3/tests/test_native_live_resize.py +143 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_native_windows.py +2 -1
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_os_frame.py +3 -1
- meltygui-0.1.3/tests/test_retina_tile_capture.py +78 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_shadow_capture_gl.py +17 -9
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_texture_overlay.py +24 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_voxel_ownership.py +5 -2
- {meltygui-0.1.2 → meltygui-0.1.3}/LICENSE +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/docs/APPS.md +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/docs/INPUT_RECORDING.md +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/docs/PUBLISHING.md +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/docs/SUPPORT_WHEELS.md +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/examples/render_overlay.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/examples/tensor_live.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/examples/tile_manager.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/examples/tile_sibling_links.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/examples/voxel_playground.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/accounts/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/accounts/internet_accounts.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/__main__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/activity.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/assets/source-icons/LICENSE +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/assets/source-icons/README.md +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/assets/source-icons/claude.png +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/assets/source-icons/claude.svg +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/assets/source-icons/codex.png +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/assets/source-icons/codex.svg +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/auto_titles.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/backends.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/chat_interface.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/chat_proxy.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/chat_service.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/claude_code.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/codex_proxy.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/codex_settings.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/codex_transport.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/command_parser.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/images.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/main.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/messages.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/metadata.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/chat/writer_locks.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/basic_converters.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/chain_converters.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/code_checks.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/codec_registry.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/core_syntax.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/file_converters.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/fileref.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/hotswap_guard.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/libcst_conversion.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/live_instrument.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/live_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/melty_scan.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/new_codecs.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/new_converters.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/project_code.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/source_context.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/symbol_roster.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/syntax_check.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/code/syntax_check_worker.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/fim.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/fim_context.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/anthropic_oauth.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/anthropic_requests.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/claude.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/claude_usage.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/codex_accounts.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/copilot.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/oauth_popup.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/ollama.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/completion/providers/profiles.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/README.md +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/action_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/collection_action.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/input_recording_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/input_replay.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/mcp_eval.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/mcp_hotswap.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/mcp_query.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/mcp_server.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/orchestration_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/query_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/search_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/selector_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/automation/value_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/cache/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/cache/cache_diagnostics.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/cache/invalidation_decoration.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/cache/invalidation_tracker.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/cache/parameter_dependencies.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/cache/tile_marks.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/bubbling.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/cache_tree.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/chain.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/converter_register.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/data_decoration.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/dict_conversion.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/dict_conversion_util.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/dynamic_obj.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/graph_compare.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/load_save_v2.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/missing_saved_class.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/path_finder.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/conversion/render_host.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/core_render.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/definition_hotswap.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/attribute_churn.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/edge_motion_guard.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/fps_counter.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/geometry_jitter.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/gpu_frame_timer.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/inspection_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/monitor_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/notifications.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/perf_trace.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/profile_decoration.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/resize_trace.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/screenshot_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/session_status.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/diagnostics/trace_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/files/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/files/file_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/files/file_explorer_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/files/file_tree_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/files/file_watch_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/files/import_graph_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/files/metadata_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/files/path_icons.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/cuda_context_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/cuda_interop_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/cuda_kernel_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/framebuffer_recorder.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/gl_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/lut_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/scene_target.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/shader_func.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/tensor_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/text_texture.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/graphics/wayland_color.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/collision.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/drag_drop_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/hypr_left_drag.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/input_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/input_handler.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/mouse_cursor.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/pynput_backend.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/space_mouse.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/touchpad_backend.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/input/view_selection.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/column_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/cursor_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/dropdown_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/edge_constraints.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/grid_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/header_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/header_runtime.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/layout_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/tile_links.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/tile_manager_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/layout/tile_resize.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/module_map.json +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/module_names.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/core_decoration.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/core_render_helpers.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/fast_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/func_metadata.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/injected_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/mode.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/mode_defaults.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/modes.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/overlay.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/parameter_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/render_dispatch.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/render_funcs.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/shaped.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/view_identity.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/rendering/window_decoration.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/app_session.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/app_settings.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/background.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/extensions.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/gc_manager.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/launch_override.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/lifecycle.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/paths.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/settings.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/singleton.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/thread_safe_bool.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/thread_signal.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/runtime/toggles.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/services/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/services/account_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/services/chat_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/services/claude_terminal_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/services/terminal_runtime.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/styling/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/styling/color_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/styling/global_style.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/styling/style.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/styling/style_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/styling/warm_start.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/backends/PYIMGUI_LICENSE +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/backends/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/backends/imgui_renderer.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/backends/native_wayland.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/backends/protocols/xdg-decoration-unstable-v1.xml +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/backends/protocols/xdg-shell.xml +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/backends/wayland_protocol.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/dock_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/frame_geometry.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/geometry_feed.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/titlebar_buttons.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/wayland_move.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/window_api.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/window_constants.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/core/windowing/window_visibility.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/debug/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/debug/app_view_utils.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/bash_syntax.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/code_line_fast.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/diff.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/external_changes.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/file_header.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/live_usage.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/live_view_views.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/pending_save.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/roster_tints.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/source_preview.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/source_tools.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/source_ui.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/spell_check.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/text_editor.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/editor/usage_picker.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/events/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/events/example.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/columns_demo.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/columns_window_demo.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/context_menu_demo.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/context_menu_window_demo.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/gui_playground.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/live_view_playground.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/lora.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/lora_data.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/lora_policies.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/mode_demo.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/modifies_demo.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/scalar_policies.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/settings_demo.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/style_layouts.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/tile_manager_demo.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/tint_demo.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/tint_functions.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/trace_demo.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/two_windows.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/examples/voxel_transfer_paths.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/files/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/files/fast_file_explorer.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/gnome_extension/lsd-window-geometry@latent-descent/extension.js +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/gnome_extension/lsd-window-geometry@latent-descent/lsd-window-geometry@latent-descent.iml +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/gnome_extension/lsd-window-geometry@latent-descent/metadata.json +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/base.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/examples.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/executor.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/filter.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/filter.pyi +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/generate_stubs.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/registry.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/shaders.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/stub_generator.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/graphics/texture_min_max.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/hdr_color.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/image_load.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/account_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/breakpoint_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/camera_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/chat_folder_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/chat_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/code_dict_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/code_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/code_proxy_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/collection_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/color_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/cuda_buffer_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/cuda_tensor_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/cuda_texture_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/dropdown_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/file_location_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/file_metadata_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/file_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/folder_icon_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/format_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/graph_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/icon_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/import_graph_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/input_recording_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/layout_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/lut_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/search_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/source_snapshot_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/tensor_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/terminal_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/texture_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/tile_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/trace_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/model/trace_report_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/models/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/models/file_meta.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/models/function_console.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/models/orchestration.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/pbr.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/png_unfilter.c +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/JetBrainsMono-Regular.ttf +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/THIRD_PARTY_NOTICES.md +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/dejavu/DejaVuSans-Bold.ttf +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/dejavu/DejaVuSans-ExtraLight.ttf +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/dejavu/DejaVuSans.ttf +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/dejavu/LICENSE.txt +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/fontawesome-LICENSE.txt +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/fontawesome-webfont.ttf +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/hdri/studio_small_09_1k.hdr +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/jetbrains-weights/JetBrainsMono-Bold.ttf +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraBold.ttf +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraLight.ttf +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/jetbrains-weights/JetBrainsMono-Light.ttf +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/jetbrains-weights/JetBrainsMono-Medium.ttf +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/jetbrains-weights/JetBrainsMono-SemiBold.ttf +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/jetbrains-weights/JetBrainsMono-Thin.ttf +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/jetbrains-weights/OFL.txt +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/resources/jetbrains-weights/README.md +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/account_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/animation_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/annotation_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/chat_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/code_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/core_enums.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/core_markers.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/core_undo.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/file_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/graph_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/inspection_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/menu_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/model_enums.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/new_core_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/orchestration_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/path_icon_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/query_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/tensor_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/terminal_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/texture_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/trace_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/view_reference.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/state/voxel_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/text_index.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/utils/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/utils/jump_to_code.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/utils/pkl_inspect.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/utils/render_utils.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/__init__.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/account_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/action_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/chat_decoration_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/chat_sidebar_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/chat_source_icon_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/chat_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/code_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/collection_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/color_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/control_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/decoration_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/diagnostic_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/dropdown_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/file_icon_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/file_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/graph_cuda_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/graph_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/header_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/input_recording_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/input_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/inspection_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/layout_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/lut_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/menu_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/orchestration_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/path_icon_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/query_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/search_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/tab_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/tensor_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/terminal_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/text_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/texture_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/tile_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/trace_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/voxel_cuda_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/voxel_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/meltygui/view/window_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/fixtures/terminal_before_runtime.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/profile_render_wrapper.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_app_settings.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_background_palette.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_breakpoint_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_cached_input_delivery.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_capture_passes.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_chat_auto_titles.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_chat_claude_code.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_chat_codex_fast.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_chat_messages.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_chat_presentation.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_chat_service.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_chat_token_usage.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_chat_turn_status.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_child_surface_cache_keepalive.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_clean_surface_skip.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_click_disambiguation.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_code_dict.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_code_dict_scenarios.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_column_edge_solve.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_column_frame_fit.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_column_maxes.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_column_right_drag_display_wall.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_context_menu_placement.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_control_paint.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_core_relocation.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_core_syntax.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_crash_report_store.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_cuda_context_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_cuda_direct_lines.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_cuda_image_interop.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_cuda_interop.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_cuda_interop_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_cuda_kernel_core.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_cuda_march.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_deferred_view_returns.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_draw_state_parent_geometry.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_dropdown_divider.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_edge_graph_solve.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_edge_motion_guard.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_fast_draw_collection.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_fast_draw_dropdown.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_fast_menu_bar.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_file_metadata_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_file_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_file_watch_limits.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_file_watch_start.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_folder_icons.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_fps_counter.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_frame_geometry_hotswap.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_freeze_scrollbar_overlay.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_fstring_highlight.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_function_console.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_geometry_feed_grace.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_geometry_jitter.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_glfw_window_app_name.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_glfw_window_editable_root.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_gpu_frame_timer.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_hdr_color.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_held_input.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_hotswap_preserves_runtime_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_image_texture.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_import_boundary.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_initial_child_placement.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_input_recording.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_live_class_apply.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_live_function_apply.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_live_store_owner.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_lut_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_mask_batch.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_native_background_drag.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_native_body_cursor.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_native_frame_contacts.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_native_resize_workarea.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_nested_layout_right_drag.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_overlay_submission_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_package_contract.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_path_icon_view.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_pending_signature_lint.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_public_boundary.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_readme_examples.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_recent_files.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_recompile_import_backfill.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_release_workflow.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_render_background.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_render_change_notification.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_render_context_injection.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_render_func_integration.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_render_host_surface_drag.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_render_overlay.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_restored_resource_ownership.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_row_edge_solve.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_saved_renderer_recovery.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_search_symbol_tables.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_shader_func.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_shaped.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_source_site_keys.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_startup_imports.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_surface_body_resize.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_syntax_check_worker.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_tensor_controls.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_tensor_model.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_tensor_slices.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_terminal_live_migration.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_terminal_ownership.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_text_texture_contexts.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_tile_frame_reuse.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_tile_hotswap_content.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_tile_links.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_tile_manager.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_tile_resize_replay.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_toggles_color.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_typing_incremental_layout.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_unmanaged_window_frames.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_view_icon_locate.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_view_identity.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_voxel_backends.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_voxel_roll_gl.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_window_call_state.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_window_collision_investigation.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_window_comment_overrides.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/test_windows_portability.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tests/untitled.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/build.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/build_in_container.sh +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/licenses/NVIDIA-CUDA-12.1-EULA.txt +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/licenses/boost.txt +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/licenses/imgui-MIT.txt +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/licenses/imstb_rectpack.h.license.txt +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/licenses/imstb_textedit.h.license.txt +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/licenses/imstb_truetype.h.license.txt +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/prepare.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tools/native_wheels/rewrite_imports.py +0 -0
- {meltygui-0.1.2 → meltygui-0.1.3}/tools/release.py +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: meltygui
|
|
3
|
-
Version: 0.1.
|
|
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
|
-
|
|
64
|
-
|
|
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
|
-
|
|
17
|
-
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
#
|
|
159
|
-
#
|
|
160
|
-
|
|
161
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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(
|
|
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,
|
|
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
|
-
|
|
538
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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]
|
|
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
|
-
|
|
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
|
-
|
|
3226
|
-
|
|
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 =
|
|
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,
|
|
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 =
|
|
5126
|
-
t_ah =
|
|
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 =
|
|
5406
|
-
m_ah =
|
|
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
|
-
|
|
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
|
|
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 = (
|
|
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
|
|
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
|
-
|
|
2304
|
-
|
|
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
|
|
5062
|
-
#
|
|
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
|
|
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),
|