meltygui 0.1.0__py3-none-any.whl
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/__init__.py +107 -0
- meltygui/accounts/__init__.py +0 -0
- meltygui/accounts/internet_accounts.py +1355 -0
- meltygui/chat/__init__.py +91 -0
- meltygui/chat/activity.py +75 -0
- meltygui/chat/backends.py +36 -0
- meltygui/chat/chat_interface.py +732 -0
- meltygui/chat/chat_proxy.py +352 -0
- meltygui/chat/codex_proxy.py +592 -0
- meltygui/chat/codex_settings.py +100 -0
- meltygui/chat/codex_transport.py +60 -0
- meltygui/chat/command_parser.py +204 -0
- meltygui/chat/images.py +227 -0
- meltygui/chat/messages.py +417 -0
- meltygui/chat/metadata.py +139 -0
- meltygui/chat/writer_locks.py +64 -0
- meltygui/code/__init__.py +0 -0
- meltygui/code/basic_converters.py +533 -0
- meltygui/code/chain_converters.py +2111 -0
- meltygui/code/code_checks.py +2209 -0
- meltygui/code/core_syntax.py +1430 -0
- meltygui/code/file_converters.py +1933 -0
- meltygui/code/fileref.py +702 -0
- meltygui/code/hotswap_guard.py +144 -0
- meltygui/code/libcst_conversion.py +9724 -0
- meltygui/code/live_instrument.py +392 -0
- meltygui/code/live_view.py +2490 -0
- meltygui/code/melty_scan.py +2684 -0
- meltygui/code/new_codecs.py +1255 -0
- meltygui/code/new_converters.py +3017 -0
- meltygui/code/project_code.py +278 -0
- meltygui/code/source_context.py +63 -0
- meltygui/code/symbol_roster.py +1588 -0
- meltygui/code/syntax_check.py +34 -0
- meltygui/code/syntax_check_worker.py +114 -0
- meltygui/completion/__init__.py +0 -0
- meltygui/completion/fim.py +1232 -0
- meltygui/completion/fim_context.py +481 -0
- meltygui/completion/providers/__init__.py +0 -0
- meltygui/completion/providers/anthropic_oauth.py +446 -0
- meltygui/completion/providers/anthropic_requests.py +69 -0
- meltygui/completion/providers/claude.py +203 -0
- meltygui/completion/providers/claude_usage.py +499 -0
- meltygui/completion/providers/codex_accounts.py +180 -0
- meltygui/completion/providers/copilot.py +617 -0
- meltygui/completion/providers/oauth_popup.py +220 -0
- meltygui/completion/providers/ollama.py +320 -0
- meltygui/completion/providers/profiles.py +23 -0
- meltygui/core/README.md +88 -0
- meltygui/core/__init__.py +1 -0
- meltygui/core/automation/__init__.py +1 -0
- meltygui/core/automation/action_core.py +153 -0
- meltygui/core/automation/collection_action.py +45 -0
- meltygui/core/automation/mcp_eval.py +167 -0
- meltygui/core/automation/mcp_hotswap.py +107 -0
- meltygui/core/automation/mcp_query.py +552 -0
- meltygui/core/automation/mcp_server.py +657 -0
- meltygui/core/automation/orchestration_core.py +2636 -0
- meltygui/core/automation/query_core.py +124 -0
- meltygui/core/automation/search_core.py +26 -0
- meltygui/core/automation/selector_core.py +340 -0
- meltygui/core/automation/value_core.py +1752 -0
- meltygui/core/cache/__init__.py +1 -0
- meltygui/core/cache/cache_diagnostics.py +0 -0
- meltygui/core/cache/invalidation_decoration.py +153 -0
- meltygui/core/cache/invalidation_tracker.py +43 -0
- meltygui/core/cache/tile_cache.py +5968 -0
- meltygui/core/conversion/__init__.py +1 -0
- meltygui/core/conversion/bubbling.py +599 -0
- meltygui/core/conversion/cache_tree.py +188 -0
- meltygui/core/conversion/chain.py +113 -0
- meltygui/core/conversion/converter_register.py +145 -0
- meltygui/core/conversion/data_decoration.py +67 -0
- meltygui/core/conversion/dict_conversion.py +1815 -0
- meltygui/core/conversion/dict_conversion_util.py +177 -0
- meltygui/core/conversion/dynamic_obj.py +89 -0
- meltygui/core/conversion/graph_compare.py +183 -0
- meltygui/core/conversion/load_save_v2.py +1032 -0
- meltygui/core/conversion/missing_saved_class.py +39 -0
- meltygui/core/conversion/path_finder.py +606 -0
- meltygui/core/conversion/render_host.py +1083 -0
- meltygui/core/core_render.py +6537 -0
- meltygui/core/definition_hotswap.py +231 -0
- meltygui/core/diagnostics/__init__.py +1 -0
- meltygui/core/diagnostics/attribute_churn.py +38 -0
- meltygui/core/diagnostics/fps_counter.py +39 -0
- meltygui/core/diagnostics/gpu_frame_timer.py +103 -0
- meltygui/core/diagnostics/inspection_core.py +169 -0
- meltygui/core/diagnostics/monitor_core.py +105 -0
- meltygui/core/diagnostics/notifications.py +706 -0
- meltygui/core/diagnostics/perf_trace.py +281 -0
- meltygui/core/diagnostics/profile_decoration.py +88 -0
- meltygui/core/diagnostics/resize_trace.py +62 -0
- meltygui/core/diagnostics/screenshot_core.py +247 -0
- meltygui/core/diagnostics/session_status.py +98 -0
- meltygui/core/diagnostics/trace_core.py +445 -0
- meltygui/core/files/__init__.py +1 -0
- meltygui/core/files/file_core.py +208 -0
- meltygui/core/files/file_explorer_core.py +104 -0
- meltygui/core/files/file_tree_core.py +198 -0
- meltygui/core/files/file_watch_core.py +43 -0
- meltygui/core/files/import_graph_core.py +43 -0
- meltygui/core/files/metadata_core.py +51 -0
- meltygui/core/graphics/__init__.py +1 -0
- meltygui/core/graphics/cuda_context_core.py +166 -0
- meltygui/core/graphics/cuda_interop_core.py +136 -0
- meltygui/core/graphics/cuda_kernel_core.py +91 -0
- meltygui/core/graphics/framebuffer_recorder.py +337 -0
- meltygui/core/graphics/gl_state.py +658 -0
- meltygui/core/graphics/lut_core.py +52 -0
- meltygui/core/graphics/overlay_renderer.py +984 -0
- meltygui/core/graphics/scene_target.py +180 -0
- meltygui/core/graphics/screenshot.py +439 -0
- meltygui/core/graphics/shader_func.py +478 -0
- meltygui/core/graphics/tensor_core.py +45 -0
- meltygui/core/graphics/text_texture.py +329 -0
- meltygui/core/graphics/wayland_color.py +635 -0
- meltygui/core/input/__init__.py +1 -0
- meltygui/core/input/collision.py +165 -0
- meltygui/core/input/drag_drop_core.py +1525 -0
- meltygui/core/input/hypr_left_drag.py +323 -0
- meltygui/core/input/input_core.py +245 -0
- meltygui/core/input/input_handler.py +1101 -0
- meltygui/core/input/mouse_cursor.py +355 -0
- meltygui/core/input/pynput_backend.py +1054 -0
- meltygui/core/input/space_mouse.py +338 -0
- meltygui/core/input/touchpad_backend.py +393 -0
- meltygui/core/input/view_selection.py +177 -0
- meltygui/core/layout/__init__.py +1 -0
- meltygui/core/layout/column_core.py +2153 -0
- meltygui/core/layout/cursor_core.py +161 -0
- meltygui/core/layout/dropdown_core.py +278 -0
- meltygui/core/layout/edge_constraints.py +155 -0
- meltygui/core/layout/grid_core.py +117 -0
- meltygui/core/layout/header_core.py +23 -0
- meltygui/core/layout/header_runtime.py +67 -0
- meltygui/core/layout/layout_core.py +87 -0
- meltygui/core/layout/tile_manager_core.py +591 -0
- meltygui/core/melty.py +6726 -0
- meltygui/core/module_map.json +896 -0
- meltygui/core/module_names.py +19 -0
- meltygui/core/rendering/__init__.py +1 -0
- meltygui/core/rendering/core_decoration.py +431 -0
- meltygui/core/rendering/core_render_helpers.py +328 -0
- meltygui/core/rendering/func_metadata.py +398 -0
- meltygui/core/rendering/mode.py +818 -0
- meltygui/core/rendering/mode_defaults.py +41 -0
- meltygui/core/rendering/modes.py +136 -0
- meltygui/core/rendering/parameter_core.py +1665 -0
- meltygui/core/rendering/render_dispatch.py +1891 -0
- meltygui/core/rendering/render_funcs.py +273 -0
- meltygui/core/rendering/shaped.py +312 -0
- meltygui/core/rendering/window_decoration.py +25 -0
- meltygui/core/runtime/__init__.py +1 -0
- meltygui/core/runtime/app.py +735 -0
- meltygui/core/runtime/app_session.py +140 -0
- meltygui/core/runtime/background.py +564 -0
- meltygui/core/runtime/extensions.py +53 -0
- meltygui/core/runtime/gc_manager.py +1163 -0
- meltygui/core/runtime/lifecycle.py +21 -0
- meltygui/core/runtime/paths.py +27 -0
- meltygui/core/runtime/settings.py +14 -0
- meltygui/core/runtime/singleton.py +16 -0
- meltygui/core/runtime/thread_safe_bool.py +24 -0
- meltygui/core/runtime/thread_signal.py +30 -0
- meltygui/core/runtime/toggles.py +3115 -0
- meltygui/core/services/__init__.py +1 -0
- meltygui/core/services/account_core.py +10 -0
- meltygui/core/services/chat_core.py +19 -0
- meltygui/core/services/claude_terminal_core.py +346 -0
- meltygui/core/services/terminal_core.py +458 -0
- meltygui/core/services/terminal_runtime.py +78 -0
- meltygui/core/styling/__init__.py +1 -0
- meltygui/core/styling/color_core.py +46 -0
- meltygui/core/styling/fonts.py +639 -0
- meltygui/core/styling/global_style.py +338 -0
- meltygui/core/styling/style.py +198 -0
- meltygui/core/styling/style_core.py +522 -0
- meltygui/core/styling/warm_start.py +149 -0
- meltygui/core/windowing/__init__.py +1 -0
- meltygui/core/windowing/backends/PYIMGUI_LICENSE +28 -0
- meltygui/core/windowing/backends/__init__.py +1 -0
- meltygui/core/windowing/backends/imgui_renderer.py +138 -0
- meltygui/core/windowing/backends/native_wayland.py +850 -0
- meltygui/core/windowing/backends/protocols/xdg-decoration-unstable-v1.xml +156 -0
- meltygui/core/windowing/backends/protocols/xdg-shell.xml +1420 -0
- meltygui/core/windowing/backends/wayland_protocol.py +101 -0
- meltygui/core/windowing/dock_core.py +182 -0
- meltygui/core/windowing/frame_geometry.py +42 -0
- meltygui/core/windowing/geometry_feed.py +864 -0
- meltygui/core/windowing/glfw_utils.py +1343 -0
- meltygui/core/windowing/os_frame.py +1552 -0
- meltygui/core/windowing/surface.py +643 -0
- meltygui/core/windowing/titlebar.py +1560 -0
- meltygui/core/windowing/titlebar_buttons.py +281 -0
- meltygui/core/windowing/wayland_move.py +932 -0
- meltygui/core/windowing/window_api.py +62 -0
- meltygui/core/windowing/window_constants.py +339 -0
- meltygui/core/windowing/window_visibility.py +162 -0
- meltygui/debug/__init__.py +0 -0
- meltygui/debug/app_view_utils.py +9 -0
- meltygui/editor/__init__.py +0 -0
- meltygui/editor/bash_syntax.py +30 -0
- meltygui/editor/code_line_fast.py +152 -0
- meltygui/editor/diff.py +139 -0
- meltygui/editor/external_changes.py +159 -0
- meltygui/editor/file_header.py +41 -0
- meltygui/editor/live_usage.py +169 -0
- meltygui/editor/live_view_views.py +1803 -0
- meltygui/editor/pending_save.py +1351 -0
- meltygui/editor/roster_tints.py +547 -0
- meltygui/editor/source_preview.py +16 -0
- meltygui/editor/source_tools.py +10 -0
- meltygui/editor/source_ui.py +70 -0
- meltygui/editor/spell_check.py +77 -0
- meltygui/editor/text_editor.py +9076 -0
- meltygui/editor/usage_picker.py +538 -0
- meltygui/events/__init__.py +0 -0
- meltygui/events/example.py +118 -0
- meltygui/examples/__init__.py +0 -0
- meltygui/examples/columns_demo.py +33 -0
- meltygui/examples/columns_window_demo.py +60 -0
- meltygui/examples/context_menu_demo.py +24 -0
- meltygui/examples/context_menu_window_demo.py +49 -0
- meltygui/examples/gui_playground.py +127 -0
- meltygui/examples/live_view_playground.py +256 -0
- meltygui/examples/lora.py +43 -0
- meltygui/examples/lora_data.py +59 -0
- meltygui/examples/lora_policies.py +67 -0
- meltygui/examples/mode_demo.py +49 -0
- meltygui/examples/modifies_demo.py +119 -0
- meltygui/examples/scalar_policies.py +60 -0
- meltygui/examples/style_layouts.py +149 -0
- meltygui/examples/tile_manager_demo.py +74 -0
- meltygui/examples/tint_demo.py +160 -0
- meltygui/examples/tint_functions.py +56 -0
- meltygui/examples/trace_demo.py +88 -0
- meltygui/examples/two_windows.py +36 -0
- meltygui/files/__init__.py +0 -0
- meltygui/files/fast_file_explorer.py +439 -0
- meltygui/gnome_extension/lsd-window-geometry@latent-descent/extension.js +237 -0
- meltygui/gnome_extension/lsd-window-geometry@latent-descent/lsd-window-geometry@latent-descent.iml +9 -0
- meltygui/gnome_extension/lsd-window-geometry@latent-descent/metadata.json +7 -0
- meltygui/graphics/__init__.py +6 -0
- meltygui/graphics/base.py +85 -0
- meltygui/graphics/examples.py +507 -0
- meltygui/graphics/executor.py +520 -0
- meltygui/graphics/filter.py +667 -0
- meltygui/graphics/filter.pyi +856 -0
- meltygui/graphics/generate_stubs.py +22 -0
- meltygui/graphics/registry.py +203 -0
- meltygui/graphics/shader_compiler.py +155 -0
- meltygui/graphics/shaders.py +1302 -0
- meltygui/graphics/stub_generator.py +250 -0
- meltygui/graphics/texture_manager.py +170 -0
- meltygui/graphics/texture_min_max.py +295 -0
- meltygui/hdr_color.py +757 -0
- meltygui/image_load.py +308 -0
- meltygui/model/__init__.py +1 -0
- meltygui/model/account_model.py +142 -0
- meltygui/model/camera_model.py +159 -0
- meltygui/model/chat_model.py +86 -0
- meltygui/model/code_model.py +62 -0
- meltygui/model/code_proxy_model.py +876 -0
- meltygui/model/collection_model.py +41 -0
- meltygui/model/color_model.py +127 -0
- meltygui/model/cuda_tensor_model.py +36 -0
- meltygui/model/cuda_texture_model.py +149 -0
- meltygui/model/dropdown_model.py +137 -0
- meltygui/model/file_metadata_model.py +73 -0
- meltygui/model/file_model.py +289 -0
- meltygui/model/format_model.py +390 -0
- meltygui/model/graph_model.py +98 -0
- meltygui/model/icon_model.py +1024 -0
- meltygui/model/import_graph_model.py +468 -0
- meltygui/model/layout_model.py +15 -0
- meltygui/model/lut_model.py +266 -0
- meltygui/model/search_model.py +173 -0
- meltygui/model/tensor_model.py +402 -0
- meltygui/model/terminal_model.py +329 -0
- meltygui/model/texture_model.py +146 -0
- meltygui/model/tile_model.py +24 -0
- meltygui/model/trace_model.py +198 -0
- meltygui/model/trace_report_model.py +146 -0
- meltygui/models/__init__.py +0 -0
- meltygui/models/file_meta.py +613 -0
- meltygui/models/function_console.py +184 -0
- meltygui/models/orchestration.py +48 -0
- meltygui/pbr.py +1576 -0
- meltygui/png_unfilter.c +49 -0
- meltygui/resources/JetBrainsMono-Regular.ttf +0 -0
- meltygui/resources/THIRD_PARTY_NOTICES.md +21 -0
- meltygui/resources/dejavu/DejaVuSans-Bold.ttf +0 -0
- meltygui/resources/dejavu/DejaVuSans-ExtraLight.ttf +0 -0
- meltygui/resources/dejavu/DejaVuSans.ttf +0 -0
- meltygui/resources/dejavu/LICENSE.txt +78 -0
- meltygui/resources/fontawesome-LICENSE.txt +121 -0
- meltygui/resources/fontawesome-webfont.ttf +0 -0
- meltygui/resources/hdri/studio_small_09_1k.hdr +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-Bold.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraBold.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraLight.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-Light.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-Medium.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-SemiBold.ttf +0 -0
- meltygui/resources/jetbrains-weights/JetBrainsMono-Thin.ttf +0 -0
- meltygui/resources/jetbrains-weights/OFL.txt +93 -0
- meltygui/resources/jetbrains-weights/README.md +2 -0
- meltygui/state/__init__.py +0 -0
- meltygui/state/account_state.py +22 -0
- meltygui/state/animation_state.py +97 -0
- meltygui/state/annotation_state.py +22 -0
- meltygui/state/chat_state.py +36 -0
- meltygui/state/code_state.py +10 -0
- meltygui/state/core_enums.py +59 -0
- meltygui/state/core_markers.py +115 -0
- meltygui/state/core_undo.py +1075 -0
- meltygui/state/file_state.py +75 -0
- meltygui/state/graph_state.py +26 -0
- meltygui/state/inspection_state.py +47 -0
- meltygui/state/menu_state.py +10 -0
- meltygui/state/model_enums.py +11 -0
- meltygui/state/new_core_model.py +2394 -0
- meltygui/state/orchestration_state.py +14 -0
- meltygui/state/query_state.py +24 -0
- meltygui/state/tensor_state.py +10 -0
- meltygui/state/terminal_state.py +23 -0
- meltygui/state/trace_state.py +32 -0
- meltygui/state/voxel_state.py +12 -0
- meltygui/text_index.py +816 -0
- meltygui/utils/__init__.py +0 -0
- meltygui/utils/jump_to_code.py +344 -0
- meltygui/utils/pkl_inspect.py +90 -0
- meltygui/utils/render_utils.py +1419 -0
- meltygui/view/__init__.py +1 -0
- meltygui/view/account_view.py +524 -0
- meltygui/view/action_view.py +73 -0
- meltygui/view/chat_decoration_view.py +112 -0
- meltygui/view/chat_view.py +1703 -0
- meltygui/view/code_view.py +2677 -0
- meltygui/view/collection_view.py +1185 -0
- meltygui/view/color_view.py +824 -0
- meltygui/view/control_view.py +559 -0
- meltygui/view/decoration_view.py +439 -0
- meltygui/view/diagnostic_view.py +177 -0
- meltygui/view/dropdown_view.py +1082 -0
- meltygui/view/file_view.py +1599 -0
- meltygui/view/graph_cuda_view.py +105 -0
- meltygui/view/graph_view.py +882 -0
- meltygui/view/header_view.py +848 -0
- meltygui/view/input_view.py +238 -0
- meltygui/view/inspection_view.py +1783 -0
- meltygui/view/layout_view.py +596 -0
- meltygui/view/lut_view.py +45 -0
- meltygui/view/menu_view.py +212 -0
- meltygui/view/orchestration_view.py +658 -0
- meltygui/view/query_view.py +118 -0
- meltygui/view/search_view.py +342 -0
- meltygui/view/tab_view.py +258 -0
- meltygui/view/tensor_view.py +430 -0
- meltygui/view/terminal_view.py +355 -0
- meltygui/view/text_view.py +8031 -0
- meltygui/view/texture_view.py +480 -0
- meltygui/view/tile_view.py +38 -0
- meltygui/view/trace_view.py +923 -0
- meltygui/view/voxel_cuda_view.py +824 -0
- meltygui/view/voxel_view.py +1860 -0
- meltygui/view/window_view.py +111 -0
- meltygui-0.1.0.dist-info/METADATA +143 -0
- meltygui-0.1.0.dist-info/RECORD +372 -0
- meltygui-0.1.0.dist-info/WHEEL +4 -0
- meltygui-0.1.0.dist-info/licenses/LICENSE +202 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"""Small ctypes libwayland binding; xdg protocol metadata comes from bundled XML."""
|
|
2
|
+
import ctypes as C
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
import xml.etree.ElementTree as ET
|
|
5
|
+
|
|
6
|
+
P = C.c_void_p
|
|
7
|
+
U = C.c_uint32
|
|
8
|
+
I = C.c_int32
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Interface(C.Structure):
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Message(C.Structure):
|
|
16
|
+
_fields_ = [('name', C.c_char_p), ('signature', C.c_char_p),
|
|
17
|
+
('types', C.POINTER(C.POINTER(Interface)))]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
Interface._fields_ = [('name', C.c_char_p), ('version', C.c_int),
|
|
21
|
+
('method_count', C.c_int), ('methods', C.POINTER(Message)),
|
|
22
|
+
('event_count', C.c_int), ('events', C.POINTER(Message))]
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def function(lib, name, result, *args):
|
|
26
|
+
fn = getattr(lib, name)
|
|
27
|
+
fn.restype, fn.argtypes = result, list(args)
|
|
28
|
+
return fn
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class Native:
|
|
32
|
+
def __init__(self):
|
|
33
|
+
self.lib = C.CDLL('libwayland-client.so.0', use_errno=True)
|
|
34
|
+
self.connect = function(self.lib, 'wl_display_connect', P, C.c_char_p)
|
|
35
|
+
self.connect_fd = function(self.lib, 'wl_display_connect_to_fd', P, C.c_int)
|
|
36
|
+
self.disconnect = function(self.lib, 'wl_display_disconnect', None, P)
|
|
37
|
+
self.dispatch = function(self.lib, 'wl_display_dispatch', C.c_int, P)
|
|
38
|
+
self.pending = function(self.lib, 'wl_display_dispatch_pending', C.c_int, P)
|
|
39
|
+
self.prepare_read = function(self.lib, 'wl_display_prepare_read', C.c_int, P)
|
|
40
|
+
self.read_events = function(self.lib, 'wl_display_read_events', C.c_int, P)
|
|
41
|
+
self.cancel_read = function(self.lib, 'wl_display_cancel_read', None, P)
|
|
42
|
+
self.roundtrip = function(self.lib, 'wl_display_roundtrip', C.c_int, P)
|
|
43
|
+
self.flush = function(self.lib, 'wl_display_flush', C.c_int, P)
|
|
44
|
+
self.get_fd = function(self.lib, 'wl_display_get_fd', C.c_int, P)
|
|
45
|
+
self.get_version = function(self.lib, 'wl_proxy_get_version', U, P)
|
|
46
|
+
self.destroy = function(self.lib, 'wl_proxy_destroy', None, P)
|
|
47
|
+
self.listen = function(self.lib, 'wl_proxy_add_listener', C.c_int, P, C.POINTER(P), P)
|
|
48
|
+
self.marshal = function(self.lib, 'wl_proxy_marshal_flags', P, P, U, C.POINTER(Interface), U, U)
|
|
49
|
+
self.interfaces = {name: Interface.in_dll(self.lib, name + '_interface') for name in
|
|
50
|
+
('wl_registry', 'wl_compositor', 'wl_surface', 'wl_seat',
|
|
51
|
+
'wl_pointer', 'wl_keyboard', 'wl_output', 'wl_shm', 'wl_shm_pool', 'wl_buffer',
|
|
52
|
+
'wl_data_device_manager', 'wl_data_device', 'wl_data_offer',
|
|
53
|
+
'wl_data_source')}
|
|
54
|
+
self.keepalive = []
|
|
55
|
+
directory = Path(__file__).with_name('protocols')
|
|
56
|
+
nodes = [node for filename in ('xdg-shell.xml', 'xdg-decoration-unstable-v1.xml')
|
|
57
|
+
for node in ET.parse(directory / filename).getroot().findall('interface')]
|
|
58
|
+
for node in nodes:
|
|
59
|
+
self.interfaces[node.get('name')] = Interface()
|
|
60
|
+
for node in nodes:
|
|
61
|
+
interface = self.interfaces[node.get('name')]
|
|
62
|
+
interface.name = node.get('name').encode()
|
|
63
|
+
interface.version = 1 # All our xdg objects negotiate v1.
|
|
64
|
+
for kind, count_field, messages_field in [('request', 'method_count', 'methods'),
|
|
65
|
+
('event', 'event_count', 'events')]:
|
|
66
|
+
messages = []
|
|
67
|
+
for event in node.findall(kind):
|
|
68
|
+
args = event.findall('arg')
|
|
69
|
+
signature = (event.get('since', '') if event.get('since', '1') != '1' else '')
|
|
70
|
+
signature += ''.join(('?' if arg.get('allow-null') == 'true' else '') +
|
|
71
|
+
{'int':'i', 'uint':'u', 'fixed':'f', 'string':'s',
|
|
72
|
+
'object':'o', 'new_id':'n', 'array':'a', 'fd':'h'}[arg.get('type')]
|
|
73
|
+
for arg in args)
|
|
74
|
+
types = (C.POINTER(Interface) * len(args))(*[
|
|
75
|
+
C.pointer(self.interfaces[arg.get('interface')]) if arg.get('interface') else None
|
|
76
|
+
for arg in args])
|
|
77
|
+
self.keepalive.append(types)
|
|
78
|
+
messages.append(Message(event.get('name').encode(), signature.encode(), types))
|
|
79
|
+
table = (Message * len(messages))(*messages)
|
|
80
|
+
self.keepalive.append(table)
|
|
81
|
+
setattr(interface, count_field, len(messages))
|
|
82
|
+
setattr(interface, messages_field, table)
|
|
83
|
+
|
|
84
|
+
def request(self, proxy, opcode, *args, interface=None, version=None, destroy=False):
|
|
85
|
+
result_interface = C.pointer(self.interfaces[interface]) if interface else None
|
|
86
|
+
version = self.get_version(proxy) if version is None else version
|
|
87
|
+
return self.marshal(proxy, opcode, result_interface, version, int(destroy), *args)
|
|
88
|
+
|
|
89
|
+
def listener(self, proxy, callbacks, error_handler):
|
|
90
|
+
functions = []
|
|
91
|
+
for types, callback in callbacks:
|
|
92
|
+
def invoke(data, obj, *args, _callback=callback):
|
|
93
|
+
try:
|
|
94
|
+
_callback(*args)
|
|
95
|
+
except BaseException as error:
|
|
96
|
+
error_handler(error)
|
|
97
|
+
functions.append(C.CFUNCTYPE(None, P, P, *types)(invoke))
|
|
98
|
+
table = (P * len(functions))(*[C.cast(fn, P) for fn in functions])
|
|
99
|
+
self.keepalive.extend([functions, table])
|
|
100
|
+
if self.listen(proxy, table, None) != 0:
|
|
101
|
+
raise RuntimeError('wl_proxy_add_listener failed')
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"""Fast Dock: the Dock's window list drawn directly to the draw list.
|
|
2
|
+
|
|
3
|
+
One @render_func body replaces draw_collection + the per-row
|
|
4
|
+
draw_managed_window / button / draw_tuple widgets. Rows are plain draw-list
|
|
5
|
+
rects/text with manual hit-testing, so a frame costs a handful of draw calls
|
|
6
|
+
instead of a render_func wrapper per widget. It still lives inside a normal
|
|
7
|
+
meltygui window (Mode.WINDOW chrome: drag, header, scroll, blit cache). Open
|
|
8
|
+
rows' buttons get their shadows from add_shadow() — standalone depth marks
|
|
9
|
+
that need no per-button draw_state for the compositor to see.
|
|
10
|
+
|
|
11
|
+
Interaction model: while the view is hovered the wrapper invalidates its tile
|
|
12
|
+
every frame (core_render's _bounding_hovered branch), so hover highlights and
|
|
13
|
+
clicks resolve inside the body with no per-row state. While NOT hovered the
|
|
14
|
+
tile is a cached blit — external changes (a window closed via its own X, a new
|
|
15
|
+
registration, a tint edit elsewhere) are caught by fast_dock_sync(), called
|
|
16
|
+
once per frame from the always-rendering root.
|
|
17
|
+
"""
|
|
18
|
+
import colorsys
|
|
19
|
+
import ctypes
|
|
20
|
+
import struct
|
|
21
|
+
|
|
22
|
+
import meltygui_imgui as imgui
|
|
23
|
+
from meltygui.hdr_color import pack_color
|
|
24
|
+
|
|
25
|
+
from meltygui.core.melty import Melty
|
|
26
|
+
from meltygui.core.runtime.toggles import Toggles
|
|
27
|
+
from meltygui.core.runtime.toggles import WindowManager
|
|
28
|
+
from meltygui.core.windowing.glfw_utils import request_render
|
|
29
|
+
from meltygui.core.styling.fonts import Font
|
|
30
|
+
from meltygui.core.cache.tile_cache import add_glow
|
|
31
|
+
from meltygui.core.cache.tile_cache import add_shadow
|
|
32
|
+
from meltygui.core.cache.tile_cache import clear_glows
|
|
33
|
+
from meltygui.core.core_render import render_func
|
|
34
|
+
from meltygui.core.rendering.core_decoration import Core
|
|
35
|
+
|
|
36
|
+
_last_signature = None
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _row_tint(managed_window, window_draw_state):
|
|
40
|
+
"""The tint shown for a row: instance attr wins over the draw_state's,
|
|
41
|
+
same precedence as draw_managed_window."""
|
|
42
|
+
window_value = managed_window.input_value
|
|
43
|
+
if window_value is not None and getattr(window_value, "tint", None) is not None:
|
|
44
|
+
return window_value.tint
|
|
45
|
+
return window_draw_state.tint
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _row_icon(name, managed_window, window_draw_state):
|
|
49
|
+
"""The icon shown for a row: the window draw_state's kwargs win over the
|
|
50
|
+
@window registration's — same fallback order as the tint lookup in
|
|
51
|
+
window_index."""
|
|
52
|
+
icon = (window_draw_state._kwargs or {}).get("icon") if window_draw_state is not None else None
|
|
53
|
+
if not icon:
|
|
54
|
+
label = str(name).split("##")[0].strip()
|
|
55
|
+
registration = (Melty.annotated_window_classes.get(label)
|
|
56
|
+
or Melty.annotated_window_classes.get(str(name)))
|
|
57
|
+
if registration is not None:
|
|
58
|
+
window_class, window_kwargs = registration
|
|
59
|
+
icon = window_kwargs.get("icon") or getattr(window_class, "icon", None)
|
|
60
|
+
return icon
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _dock_signature():
|
|
64
|
+
rows = []
|
|
65
|
+
for managed_window in Melty.registered_windows.values():
|
|
66
|
+
window_draw_state = managed_window.draw_state
|
|
67
|
+
if window_draw_state is None:
|
|
68
|
+
continue
|
|
69
|
+
name = str(window_draw_state.name)
|
|
70
|
+
rows.append((name, window_draw_state.closed, window_draw_state.live,
|
|
71
|
+
_row_tint(managed_window, window_draw_state),
|
|
72
|
+
_row_icon(name, managed_window, window_draw_state)))
|
|
73
|
+
rows.sort(key=lambda row: row[0])
|
|
74
|
+
return tuple(rows)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def fast_dock_sync():
|
|
78
|
+
"""Once per frame from the root: repaint the Fast Dock when any window's
|
|
79
|
+
dock-visible state changed OUTSIDE the dock (its own close button, a new
|
|
80
|
+
window registering, a tint edit elsewhere). The dock's own clicks happen
|
|
81
|
+
while it's hovered, where the wrapper already re-renders every frame."""
|
|
82
|
+
global _last_signature
|
|
83
|
+
signature = _dock_signature()
|
|
84
|
+
if signature != _last_signature:
|
|
85
|
+
_last_signature = signature
|
|
86
|
+
Melty.cache.invalidate_up_by_obj(Melty.registered_windows, force=True)
|
|
87
|
+
request_render()
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _summon(window_draw_state, dock_draw_state, row_top):
|
|
91
|
+
"""Reposition `window_draw_state` just right of the dock at this row and
|
|
92
|
+
raise it — the same math as the old dock's name/target buttons, now via
|
|
93
|
+
Melty.summon_window so the placement is bounded to the display (a row low
|
|
94
|
+
in a long dock would otherwise open the window with its bottom off the
|
|
95
|
+
bottom of the screen)."""
|
|
96
|
+
this_window_right = dock_draw_state.abs_left + dock_draw_state.width
|
|
97
|
+
Core.melty.summon_window(window_draw_state, this_window_right + 10, row_top)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _mix(style_manager, tint, value, factor, saturation):
|
|
101
|
+
# Rows whose window never set a tint fall back to this bright neutral.
|
|
102
|
+
fallback_tint = (2.558, 0.5, 0.5)
|
|
103
|
+
color = tint if (isinstance(tint, tuple) and len(tint) >= 3) else fallback_tint
|
|
104
|
+
return style_manager.make_color_rgb(color[0], color[1], color[2], value=value,
|
|
105
|
+
factor=factor, saturation_scale=saturation)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _color_u32(color, alpha=1.0):
|
|
109
|
+
return pack_color(color[0], color[1], color[2], alpha)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _floor_value(rgb, min_value):
|
|
113
|
+
"""`rgb` with its hsv value raised to at least `min_value` (hue and
|
|
114
|
+
saturation kept). Same floor as open_files._tab_text_color's
|
|
115
|
+
min_brightness: a dark window tint otherwise scales the open row's text
|
|
116
|
+
toward black."""
|
|
117
|
+
if min_value <= 0.0:
|
|
118
|
+
return rgb
|
|
119
|
+
h, s, v = colorsys.rgb_to_hsv(*rgb[:3])
|
|
120
|
+
if v >= min_value:
|
|
121
|
+
return rgb
|
|
122
|
+
return colorsys.hsv_to_rgb(h, s, min(min_value, 1.0)) + tuple(rgb[3:])
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def _scale_saturation(rgb, scale):
|
|
126
|
+
"""`rgb` with its hsv saturation multiplied by `scale` (hue and value
|
|
127
|
+
kept). This works where a saturation_scale into _mix does not: _mix's
|
|
128
|
+
make_color_rgb only applies saturation_scale to the THEME-derived half
|
|
129
|
+
of the blend, and at icon_bg_factor 0.45 most of the tile color is the
|
|
130
|
+
raw window tint — so the knob barely moved the result. Scaling the
|
|
131
|
+
FINAL color desaturates all of it."""
|
|
132
|
+
if scale >= 1.0:
|
|
133
|
+
return rgb
|
|
134
|
+
h, s, v = colorsys.rgb_to_hsv(*rgb[:3])
|
|
135
|
+
return colorsys.hsv_to_rgb(h, s * max(0.0, scale), v) + tuple(rgb[3:])
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
# (font_size, glyph) → the glyph's ink rect relative to the add_text pen.
|
|
139
|
+
_glyph_ink_cache = {}
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def _draw_glyph_ink_centered(draw_list, glyph, center_x, center_y, color_u32):
|
|
143
|
+
"""add_text with the glyph's INK rect centered on (center_x, center_y).
|
|
144
|
+
|
|
145
|
+
calc_text_size measures the font's LINE BOX; an icon glyph's ink sits
|
|
146
|
+
wherever the face put it inside that box, so box-centering reads a few
|
|
147
|
+
px off per glyph (the Important tiles made it visible). imgui does know
|
|
148
|
+
the true ink rect — it is the quad add_text emits. So: draw at the
|
|
149
|
+
box-centered guess, read the 4 vertices just written off the draw list,
|
|
150
|
+
shift them onto the true center in place (same frame, no flicker), and
|
|
151
|
+
cache the pen→ink offset so every later draw positions the pen exactly.
|
|
152
|
+
A glyph missing from the atlas emits no quad and keeps the box guess."""
|
|
153
|
+
line_box = imgui.calc_text_size(glyph)
|
|
154
|
+
pen_x = center_x - line_box[0] / 2.0
|
|
155
|
+
pen_y = center_y - line_box[1] / 2.0
|
|
156
|
+
key = (imgui.get_font_size(), glyph)
|
|
157
|
+
ink = _glyph_ink_cache.get(key)
|
|
158
|
+
if ink is not None:
|
|
159
|
+
ink_x0, ink_y0, ink_x1, ink_y1 = ink
|
|
160
|
+
draw_list.add_text(center_x - (ink_x0 + ink_x1) / 2.0,
|
|
161
|
+
center_y - (ink_y0 + ink_y1) / 2.0, color_u32, glyph)
|
|
162
|
+
return
|
|
163
|
+
vertex_start = draw_list.vtx_buffer_size
|
|
164
|
+
draw_list.add_text(pen_x, pen_y, color_u32, glyph)
|
|
165
|
+
if draw_list.vtx_buffer_size != vertex_start + 4:
|
|
166
|
+
return # glyph not in the atlas: box guess stands
|
|
167
|
+
vertex_base = draw_list.vtx_buffer_data + vertex_start * imgui.VERTEX_SIZE
|
|
168
|
+
raw = ctypes.string_at(vertex_base, 3 * imgui.VERTEX_SIZE)
|
|
169
|
+
ink_x0, ink_y0 = struct.unpack_from("ff", raw, 0)
|
|
170
|
+
ink_x1, ink_y1 = struct.unpack_from("ff", raw, 2 * imgui.VERTEX_SIZE)
|
|
171
|
+
_glyph_ink_cache[key] = (ink_x0 - pen_x, ink_y0 - pen_y, ink_x1 - pen_x, ink_y1 - pen_y)
|
|
172
|
+
shift_x = center_x - (ink_x0 + ink_x1) / 2.0
|
|
173
|
+
shift_y = center_y - (ink_y0 + ink_y1) / 2.0
|
|
174
|
+
if abs(shift_x) > 0.01 or abs(shift_y) > 0.01:
|
|
175
|
+
for vertex_index in range(4):
|
|
176
|
+
position = ctypes.cast(vertex_base + vertex_index * imgui.VERTEX_SIZE,
|
|
177
|
+
ctypes.POINTER(ctypes.c_float))
|
|
178
|
+
position[0] += shift_x
|
|
179
|
+
position[1] += shift_y
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
from meltygui.core.layout.layout_core import dock_header
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""Geometric relationships between caller-owned frames and native surfaces.
|
|
2
|
+
|
|
3
|
+
A surface body is connected by two fixed gaps, not a second free window inside
|
|
4
|
+
its native frame. Both native containment and local layout use this relationship.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SurfaceBinding:
|
|
9
|
+
def __init__(self, window, axis, near_gap, far_gap):
|
|
10
|
+
self.window = window
|
|
11
|
+
self.axis = axis
|
|
12
|
+
self.near_gap = float(near_gap)
|
|
13
|
+
self.far_gap = float(far_gap)
|
|
14
|
+
|
|
15
|
+
def content_size(self, native_size):
|
|
16
|
+
return native_size - self.near_gap - self.far_gap
|
|
17
|
+
|
|
18
|
+
def minimum_size(self, content_minimum):
|
|
19
|
+
return content_minimum + self.near_gap + self.far_gap
|
|
20
|
+
|
|
21
|
+
def cells(self, native_edges, frame_edges):
|
|
22
|
+
near, far = native_edges
|
|
23
|
+
frame_near, frame_far = frame_edges
|
|
24
|
+
return ([(near, frame_near, self.near_gap, self.near_gap),
|
|
25
|
+
(frame_far, far, self.far_gap, self.far_gap)])
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class EdgeProjection:
|
|
29
|
+
"""Private native/display edge copies with their stable source identities.
|
|
30
|
+
|
|
31
|
+
A context owns this collection for one local solve. Keeping the projection
|
|
32
|
+
together also leaves Context's existing slot layout intact during hotswap.
|
|
33
|
+
"""
|
|
34
|
+
def __init__(self, native, screen, binding):
|
|
35
|
+
self.binding = binding
|
|
36
|
+
self.native = tuple(dict(edge) for edge in native)
|
|
37
|
+
self.screen = tuple(dict(edge) for edge in screen)
|
|
38
|
+
self.sources = {id(local): source for local, source in
|
|
39
|
+
zip((*self.native, *self.screen), (*native, *screen))}
|
|
40
|
+
|
|
41
|
+
def __iter__(self):
|
|
42
|
+
return iter((*self.native, *self.screen))
|