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.
Files changed (372) hide show
  1. meltygui/__init__.py +107 -0
  2. meltygui/accounts/__init__.py +0 -0
  3. meltygui/accounts/internet_accounts.py +1355 -0
  4. meltygui/chat/__init__.py +91 -0
  5. meltygui/chat/activity.py +75 -0
  6. meltygui/chat/backends.py +36 -0
  7. meltygui/chat/chat_interface.py +732 -0
  8. meltygui/chat/chat_proxy.py +352 -0
  9. meltygui/chat/codex_proxy.py +592 -0
  10. meltygui/chat/codex_settings.py +100 -0
  11. meltygui/chat/codex_transport.py +60 -0
  12. meltygui/chat/command_parser.py +204 -0
  13. meltygui/chat/images.py +227 -0
  14. meltygui/chat/messages.py +417 -0
  15. meltygui/chat/metadata.py +139 -0
  16. meltygui/chat/writer_locks.py +64 -0
  17. meltygui/code/__init__.py +0 -0
  18. meltygui/code/basic_converters.py +533 -0
  19. meltygui/code/chain_converters.py +2111 -0
  20. meltygui/code/code_checks.py +2209 -0
  21. meltygui/code/core_syntax.py +1430 -0
  22. meltygui/code/file_converters.py +1933 -0
  23. meltygui/code/fileref.py +702 -0
  24. meltygui/code/hotswap_guard.py +144 -0
  25. meltygui/code/libcst_conversion.py +9724 -0
  26. meltygui/code/live_instrument.py +392 -0
  27. meltygui/code/live_view.py +2490 -0
  28. meltygui/code/melty_scan.py +2684 -0
  29. meltygui/code/new_codecs.py +1255 -0
  30. meltygui/code/new_converters.py +3017 -0
  31. meltygui/code/project_code.py +278 -0
  32. meltygui/code/source_context.py +63 -0
  33. meltygui/code/symbol_roster.py +1588 -0
  34. meltygui/code/syntax_check.py +34 -0
  35. meltygui/code/syntax_check_worker.py +114 -0
  36. meltygui/completion/__init__.py +0 -0
  37. meltygui/completion/fim.py +1232 -0
  38. meltygui/completion/fim_context.py +481 -0
  39. meltygui/completion/providers/__init__.py +0 -0
  40. meltygui/completion/providers/anthropic_oauth.py +446 -0
  41. meltygui/completion/providers/anthropic_requests.py +69 -0
  42. meltygui/completion/providers/claude.py +203 -0
  43. meltygui/completion/providers/claude_usage.py +499 -0
  44. meltygui/completion/providers/codex_accounts.py +180 -0
  45. meltygui/completion/providers/copilot.py +617 -0
  46. meltygui/completion/providers/oauth_popup.py +220 -0
  47. meltygui/completion/providers/ollama.py +320 -0
  48. meltygui/completion/providers/profiles.py +23 -0
  49. meltygui/core/README.md +88 -0
  50. meltygui/core/__init__.py +1 -0
  51. meltygui/core/automation/__init__.py +1 -0
  52. meltygui/core/automation/action_core.py +153 -0
  53. meltygui/core/automation/collection_action.py +45 -0
  54. meltygui/core/automation/mcp_eval.py +167 -0
  55. meltygui/core/automation/mcp_hotswap.py +107 -0
  56. meltygui/core/automation/mcp_query.py +552 -0
  57. meltygui/core/automation/mcp_server.py +657 -0
  58. meltygui/core/automation/orchestration_core.py +2636 -0
  59. meltygui/core/automation/query_core.py +124 -0
  60. meltygui/core/automation/search_core.py +26 -0
  61. meltygui/core/automation/selector_core.py +340 -0
  62. meltygui/core/automation/value_core.py +1752 -0
  63. meltygui/core/cache/__init__.py +1 -0
  64. meltygui/core/cache/cache_diagnostics.py +0 -0
  65. meltygui/core/cache/invalidation_decoration.py +153 -0
  66. meltygui/core/cache/invalidation_tracker.py +43 -0
  67. meltygui/core/cache/tile_cache.py +5968 -0
  68. meltygui/core/conversion/__init__.py +1 -0
  69. meltygui/core/conversion/bubbling.py +599 -0
  70. meltygui/core/conversion/cache_tree.py +188 -0
  71. meltygui/core/conversion/chain.py +113 -0
  72. meltygui/core/conversion/converter_register.py +145 -0
  73. meltygui/core/conversion/data_decoration.py +67 -0
  74. meltygui/core/conversion/dict_conversion.py +1815 -0
  75. meltygui/core/conversion/dict_conversion_util.py +177 -0
  76. meltygui/core/conversion/dynamic_obj.py +89 -0
  77. meltygui/core/conversion/graph_compare.py +183 -0
  78. meltygui/core/conversion/load_save_v2.py +1032 -0
  79. meltygui/core/conversion/missing_saved_class.py +39 -0
  80. meltygui/core/conversion/path_finder.py +606 -0
  81. meltygui/core/conversion/render_host.py +1083 -0
  82. meltygui/core/core_render.py +6537 -0
  83. meltygui/core/definition_hotswap.py +231 -0
  84. meltygui/core/diagnostics/__init__.py +1 -0
  85. meltygui/core/diagnostics/attribute_churn.py +38 -0
  86. meltygui/core/diagnostics/fps_counter.py +39 -0
  87. meltygui/core/diagnostics/gpu_frame_timer.py +103 -0
  88. meltygui/core/diagnostics/inspection_core.py +169 -0
  89. meltygui/core/diagnostics/monitor_core.py +105 -0
  90. meltygui/core/diagnostics/notifications.py +706 -0
  91. meltygui/core/diagnostics/perf_trace.py +281 -0
  92. meltygui/core/diagnostics/profile_decoration.py +88 -0
  93. meltygui/core/diagnostics/resize_trace.py +62 -0
  94. meltygui/core/diagnostics/screenshot_core.py +247 -0
  95. meltygui/core/diagnostics/session_status.py +98 -0
  96. meltygui/core/diagnostics/trace_core.py +445 -0
  97. meltygui/core/files/__init__.py +1 -0
  98. meltygui/core/files/file_core.py +208 -0
  99. meltygui/core/files/file_explorer_core.py +104 -0
  100. meltygui/core/files/file_tree_core.py +198 -0
  101. meltygui/core/files/file_watch_core.py +43 -0
  102. meltygui/core/files/import_graph_core.py +43 -0
  103. meltygui/core/files/metadata_core.py +51 -0
  104. meltygui/core/graphics/__init__.py +1 -0
  105. meltygui/core/graphics/cuda_context_core.py +166 -0
  106. meltygui/core/graphics/cuda_interop_core.py +136 -0
  107. meltygui/core/graphics/cuda_kernel_core.py +91 -0
  108. meltygui/core/graphics/framebuffer_recorder.py +337 -0
  109. meltygui/core/graphics/gl_state.py +658 -0
  110. meltygui/core/graphics/lut_core.py +52 -0
  111. meltygui/core/graphics/overlay_renderer.py +984 -0
  112. meltygui/core/graphics/scene_target.py +180 -0
  113. meltygui/core/graphics/screenshot.py +439 -0
  114. meltygui/core/graphics/shader_func.py +478 -0
  115. meltygui/core/graphics/tensor_core.py +45 -0
  116. meltygui/core/graphics/text_texture.py +329 -0
  117. meltygui/core/graphics/wayland_color.py +635 -0
  118. meltygui/core/input/__init__.py +1 -0
  119. meltygui/core/input/collision.py +165 -0
  120. meltygui/core/input/drag_drop_core.py +1525 -0
  121. meltygui/core/input/hypr_left_drag.py +323 -0
  122. meltygui/core/input/input_core.py +245 -0
  123. meltygui/core/input/input_handler.py +1101 -0
  124. meltygui/core/input/mouse_cursor.py +355 -0
  125. meltygui/core/input/pynput_backend.py +1054 -0
  126. meltygui/core/input/space_mouse.py +338 -0
  127. meltygui/core/input/touchpad_backend.py +393 -0
  128. meltygui/core/input/view_selection.py +177 -0
  129. meltygui/core/layout/__init__.py +1 -0
  130. meltygui/core/layout/column_core.py +2153 -0
  131. meltygui/core/layout/cursor_core.py +161 -0
  132. meltygui/core/layout/dropdown_core.py +278 -0
  133. meltygui/core/layout/edge_constraints.py +155 -0
  134. meltygui/core/layout/grid_core.py +117 -0
  135. meltygui/core/layout/header_core.py +23 -0
  136. meltygui/core/layout/header_runtime.py +67 -0
  137. meltygui/core/layout/layout_core.py +87 -0
  138. meltygui/core/layout/tile_manager_core.py +591 -0
  139. meltygui/core/melty.py +6726 -0
  140. meltygui/core/module_map.json +896 -0
  141. meltygui/core/module_names.py +19 -0
  142. meltygui/core/rendering/__init__.py +1 -0
  143. meltygui/core/rendering/core_decoration.py +431 -0
  144. meltygui/core/rendering/core_render_helpers.py +328 -0
  145. meltygui/core/rendering/func_metadata.py +398 -0
  146. meltygui/core/rendering/mode.py +818 -0
  147. meltygui/core/rendering/mode_defaults.py +41 -0
  148. meltygui/core/rendering/modes.py +136 -0
  149. meltygui/core/rendering/parameter_core.py +1665 -0
  150. meltygui/core/rendering/render_dispatch.py +1891 -0
  151. meltygui/core/rendering/render_funcs.py +273 -0
  152. meltygui/core/rendering/shaped.py +312 -0
  153. meltygui/core/rendering/window_decoration.py +25 -0
  154. meltygui/core/runtime/__init__.py +1 -0
  155. meltygui/core/runtime/app.py +735 -0
  156. meltygui/core/runtime/app_session.py +140 -0
  157. meltygui/core/runtime/background.py +564 -0
  158. meltygui/core/runtime/extensions.py +53 -0
  159. meltygui/core/runtime/gc_manager.py +1163 -0
  160. meltygui/core/runtime/lifecycle.py +21 -0
  161. meltygui/core/runtime/paths.py +27 -0
  162. meltygui/core/runtime/settings.py +14 -0
  163. meltygui/core/runtime/singleton.py +16 -0
  164. meltygui/core/runtime/thread_safe_bool.py +24 -0
  165. meltygui/core/runtime/thread_signal.py +30 -0
  166. meltygui/core/runtime/toggles.py +3115 -0
  167. meltygui/core/services/__init__.py +1 -0
  168. meltygui/core/services/account_core.py +10 -0
  169. meltygui/core/services/chat_core.py +19 -0
  170. meltygui/core/services/claude_terminal_core.py +346 -0
  171. meltygui/core/services/terminal_core.py +458 -0
  172. meltygui/core/services/terminal_runtime.py +78 -0
  173. meltygui/core/styling/__init__.py +1 -0
  174. meltygui/core/styling/color_core.py +46 -0
  175. meltygui/core/styling/fonts.py +639 -0
  176. meltygui/core/styling/global_style.py +338 -0
  177. meltygui/core/styling/style.py +198 -0
  178. meltygui/core/styling/style_core.py +522 -0
  179. meltygui/core/styling/warm_start.py +149 -0
  180. meltygui/core/windowing/__init__.py +1 -0
  181. meltygui/core/windowing/backends/PYIMGUI_LICENSE +28 -0
  182. meltygui/core/windowing/backends/__init__.py +1 -0
  183. meltygui/core/windowing/backends/imgui_renderer.py +138 -0
  184. meltygui/core/windowing/backends/native_wayland.py +850 -0
  185. meltygui/core/windowing/backends/protocols/xdg-decoration-unstable-v1.xml +156 -0
  186. meltygui/core/windowing/backends/protocols/xdg-shell.xml +1420 -0
  187. meltygui/core/windowing/backends/wayland_protocol.py +101 -0
  188. meltygui/core/windowing/dock_core.py +182 -0
  189. meltygui/core/windowing/frame_geometry.py +42 -0
  190. meltygui/core/windowing/geometry_feed.py +864 -0
  191. meltygui/core/windowing/glfw_utils.py +1343 -0
  192. meltygui/core/windowing/os_frame.py +1552 -0
  193. meltygui/core/windowing/surface.py +643 -0
  194. meltygui/core/windowing/titlebar.py +1560 -0
  195. meltygui/core/windowing/titlebar_buttons.py +281 -0
  196. meltygui/core/windowing/wayland_move.py +932 -0
  197. meltygui/core/windowing/window_api.py +62 -0
  198. meltygui/core/windowing/window_constants.py +339 -0
  199. meltygui/core/windowing/window_visibility.py +162 -0
  200. meltygui/debug/__init__.py +0 -0
  201. meltygui/debug/app_view_utils.py +9 -0
  202. meltygui/editor/__init__.py +0 -0
  203. meltygui/editor/bash_syntax.py +30 -0
  204. meltygui/editor/code_line_fast.py +152 -0
  205. meltygui/editor/diff.py +139 -0
  206. meltygui/editor/external_changes.py +159 -0
  207. meltygui/editor/file_header.py +41 -0
  208. meltygui/editor/live_usage.py +169 -0
  209. meltygui/editor/live_view_views.py +1803 -0
  210. meltygui/editor/pending_save.py +1351 -0
  211. meltygui/editor/roster_tints.py +547 -0
  212. meltygui/editor/source_preview.py +16 -0
  213. meltygui/editor/source_tools.py +10 -0
  214. meltygui/editor/source_ui.py +70 -0
  215. meltygui/editor/spell_check.py +77 -0
  216. meltygui/editor/text_editor.py +9076 -0
  217. meltygui/editor/usage_picker.py +538 -0
  218. meltygui/events/__init__.py +0 -0
  219. meltygui/events/example.py +118 -0
  220. meltygui/examples/__init__.py +0 -0
  221. meltygui/examples/columns_demo.py +33 -0
  222. meltygui/examples/columns_window_demo.py +60 -0
  223. meltygui/examples/context_menu_demo.py +24 -0
  224. meltygui/examples/context_menu_window_demo.py +49 -0
  225. meltygui/examples/gui_playground.py +127 -0
  226. meltygui/examples/live_view_playground.py +256 -0
  227. meltygui/examples/lora.py +43 -0
  228. meltygui/examples/lora_data.py +59 -0
  229. meltygui/examples/lora_policies.py +67 -0
  230. meltygui/examples/mode_demo.py +49 -0
  231. meltygui/examples/modifies_demo.py +119 -0
  232. meltygui/examples/scalar_policies.py +60 -0
  233. meltygui/examples/style_layouts.py +149 -0
  234. meltygui/examples/tile_manager_demo.py +74 -0
  235. meltygui/examples/tint_demo.py +160 -0
  236. meltygui/examples/tint_functions.py +56 -0
  237. meltygui/examples/trace_demo.py +88 -0
  238. meltygui/examples/two_windows.py +36 -0
  239. meltygui/files/__init__.py +0 -0
  240. meltygui/files/fast_file_explorer.py +439 -0
  241. meltygui/gnome_extension/lsd-window-geometry@latent-descent/extension.js +237 -0
  242. meltygui/gnome_extension/lsd-window-geometry@latent-descent/lsd-window-geometry@latent-descent.iml +9 -0
  243. meltygui/gnome_extension/lsd-window-geometry@latent-descent/metadata.json +7 -0
  244. meltygui/graphics/__init__.py +6 -0
  245. meltygui/graphics/base.py +85 -0
  246. meltygui/graphics/examples.py +507 -0
  247. meltygui/graphics/executor.py +520 -0
  248. meltygui/graphics/filter.py +667 -0
  249. meltygui/graphics/filter.pyi +856 -0
  250. meltygui/graphics/generate_stubs.py +22 -0
  251. meltygui/graphics/registry.py +203 -0
  252. meltygui/graphics/shader_compiler.py +155 -0
  253. meltygui/graphics/shaders.py +1302 -0
  254. meltygui/graphics/stub_generator.py +250 -0
  255. meltygui/graphics/texture_manager.py +170 -0
  256. meltygui/graphics/texture_min_max.py +295 -0
  257. meltygui/hdr_color.py +757 -0
  258. meltygui/image_load.py +308 -0
  259. meltygui/model/__init__.py +1 -0
  260. meltygui/model/account_model.py +142 -0
  261. meltygui/model/camera_model.py +159 -0
  262. meltygui/model/chat_model.py +86 -0
  263. meltygui/model/code_model.py +62 -0
  264. meltygui/model/code_proxy_model.py +876 -0
  265. meltygui/model/collection_model.py +41 -0
  266. meltygui/model/color_model.py +127 -0
  267. meltygui/model/cuda_tensor_model.py +36 -0
  268. meltygui/model/cuda_texture_model.py +149 -0
  269. meltygui/model/dropdown_model.py +137 -0
  270. meltygui/model/file_metadata_model.py +73 -0
  271. meltygui/model/file_model.py +289 -0
  272. meltygui/model/format_model.py +390 -0
  273. meltygui/model/graph_model.py +98 -0
  274. meltygui/model/icon_model.py +1024 -0
  275. meltygui/model/import_graph_model.py +468 -0
  276. meltygui/model/layout_model.py +15 -0
  277. meltygui/model/lut_model.py +266 -0
  278. meltygui/model/search_model.py +173 -0
  279. meltygui/model/tensor_model.py +402 -0
  280. meltygui/model/terminal_model.py +329 -0
  281. meltygui/model/texture_model.py +146 -0
  282. meltygui/model/tile_model.py +24 -0
  283. meltygui/model/trace_model.py +198 -0
  284. meltygui/model/trace_report_model.py +146 -0
  285. meltygui/models/__init__.py +0 -0
  286. meltygui/models/file_meta.py +613 -0
  287. meltygui/models/function_console.py +184 -0
  288. meltygui/models/orchestration.py +48 -0
  289. meltygui/pbr.py +1576 -0
  290. meltygui/png_unfilter.c +49 -0
  291. meltygui/resources/JetBrainsMono-Regular.ttf +0 -0
  292. meltygui/resources/THIRD_PARTY_NOTICES.md +21 -0
  293. meltygui/resources/dejavu/DejaVuSans-Bold.ttf +0 -0
  294. meltygui/resources/dejavu/DejaVuSans-ExtraLight.ttf +0 -0
  295. meltygui/resources/dejavu/DejaVuSans.ttf +0 -0
  296. meltygui/resources/dejavu/LICENSE.txt +78 -0
  297. meltygui/resources/fontawesome-LICENSE.txt +121 -0
  298. meltygui/resources/fontawesome-webfont.ttf +0 -0
  299. meltygui/resources/hdri/studio_small_09_1k.hdr +0 -0
  300. meltygui/resources/jetbrains-weights/JetBrainsMono-Bold.ttf +0 -0
  301. meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraBold.ttf +0 -0
  302. meltygui/resources/jetbrains-weights/JetBrainsMono-ExtraLight.ttf +0 -0
  303. meltygui/resources/jetbrains-weights/JetBrainsMono-Light.ttf +0 -0
  304. meltygui/resources/jetbrains-weights/JetBrainsMono-Medium.ttf +0 -0
  305. meltygui/resources/jetbrains-weights/JetBrainsMono-SemiBold.ttf +0 -0
  306. meltygui/resources/jetbrains-weights/JetBrainsMono-Thin.ttf +0 -0
  307. meltygui/resources/jetbrains-weights/OFL.txt +93 -0
  308. meltygui/resources/jetbrains-weights/README.md +2 -0
  309. meltygui/state/__init__.py +0 -0
  310. meltygui/state/account_state.py +22 -0
  311. meltygui/state/animation_state.py +97 -0
  312. meltygui/state/annotation_state.py +22 -0
  313. meltygui/state/chat_state.py +36 -0
  314. meltygui/state/code_state.py +10 -0
  315. meltygui/state/core_enums.py +59 -0
  316. meltygui/state/core_markers.py +115 -0
  317. meltygui/state/core_undo.py +1075 -0
  318. meltygui/state/file_state.py +75 -0
  319. meltygui/state/graph_state.py +26 -0
  320. meltygui/state/inspection_state.py +47 -0
  321. meltygui/state/menu_state.py +10 -0
  322. meltygui/state/model_enums.py +11 -0
  323. meltygui/state/new_core_model.py +2394 -0
  324. meltygui/state/orchestration_state.py +14 -0
  325. meltygui/state/query_state.py +24 -0
  326. meltygui/state/tensor_state.py +10 -0
  327. meltygui/state/terminal_state.py +23 -0
  328. meltygui/state/trace_state.py +32 -0
  329. meltygui/state/voxel_state.py +12 -0
  330. meltygui/text_index.py +816 -0
  331. meltygui/utils/__init__.py +0 -0
  332. meltygui/utils/jump_to_code.py +344 -0
  333. meltygui/utils/pkl_inspect.py +90 -0
  334. meltygui/utils/render_utils.py +1419 -0
  335. meltygui/view/__init__.py +1 -0
  336. meltygui/view/account_view.py +524 -0
  337. meltygui/view/action_view.py +73 -0
  338. meltygui/view/chat_decoration_view.py +112 -0
  339. meltygui/view/chat_view.py +1703 -0
  340. meltygui/view/code_view.py +2677 -0
  341. meltygui/view/collection_view.py +1185 -0
  342. meltygui/view/color_view.py +824 -0
  343. meltygui/view/control_view.py +559 -0
  344. meltygui/view/decoration_view.py +439 -0
  345. meltygui/view/diagnostic_view.py +177 -0
  346. meltygui/view/dropdown_view.py +1082 -0
  347. meltygui/view/file_view.py +1599 -0
  348. meltygui/view/graph_cuda_view.py +105 -0
  349. meltygui/view/graph_view.py +882 -0
  350. meltygui/view/header_view.py +848 -0
  351. meltygui/view/input_view.py +238 -0
  352. meltygui/view/inspection_view.py +1783 -0
  353. meltygui/view/layout_view.py +596 -0
  354. meltygui/view/lut_view.py +45 -0
  355. meltygui/view/menu_view.py +212 -0
  356. meltygui/view/orchestration_view.py +658 -0
  357. meltygui/view/query_view.py +118 -0
  358. meltygui/view/search_view.py +342 -0
  359. meltygui/view/tab_view.py +258 -0
  360. meltygui/view/tensor_view.py +430 -0
  361. meltygui/view/terminal_view.py +355 -0
  362. meltygui/view/text_view.py +8031 -0
  363. meltygui/view/texture_view.py +480 -0
  364. meltygui/view/tile_view.py +38 -0
  365. meltygui/view/trace_view.py +923 -0
  366. meltygui/view/voxel_cuda_view.py +824 -0
  367. meltygui/view/voxel_view.py +1860 -0
  368. meltygui/view/window_view.py +111 -0
  369. meltygui-0.1.0.dist-info/METADATA +143 -0
  370. meltygui-0.1.0.dist-info/RECORD +372 -0
  371. meltygui-0.1.0.dist-info/WHEEL +4 -0
  372. 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))