Files
SonicForgeStudio/native_bridge/debug/fix_wmsize_helper.py
T

51 lines
2.4 KiB
Python

import subprocess
def load(p):
return open(p, encoding='utf-8', newline='').read()
def save(p, s):
open(p, 'w', encoding='utf-8', newline='').write(s)
def rep(s, needle, repl, tag):
n = s.count(needle)
if n != 1:
raise SystemExit("FAIL %s: needle count=%d" % (tag, n))
return s.replace(needle, repl)
cr = '\r\n'
mp = load('native_bridge/src/main.cpp')
# 1. forward-declare helper near post_close_gui fwd decl
mp = rep(mp,
"static void post_close_gui(uint32_t ch, HWND hwnd); // defined after ChannelWorker",
"static void post_close_gui(uint32_t ch, HWND hwnd); // defined after ChannelWorker" + cr + "static void post_resize_view(uint32_t ch, int w, int h); // defined after ChannelWorker",
"fwd")
# 2. define helper after ChannelWorker class, before same-plugin helpers
anchor = "// --- same-plugin-DLL silence helpers"
helper = (
"// resizeView() must run on the channel worker (the view was attached in its" + cr +
"// COM STA apartment), never on the main pump thread." + cr +
"static void post_resize_view(uint32_t ch, int w, int h) {" + cr +
" if (g_workers) {" + cr +
" auto wit = g_workers->find(ch);" + cr +
" if (wit != g_workers->end()) {" + cr +
" wit->second->post([ch, w, h]() {" + cr +
" if (!g_engine) return;" + cr +
" auto* i = g_engine->get(ch);" + cr +
" if (i) i->resizeView(w, h);" + cr +
" });" + cr +
" }" + cr +
" }" + cr +
"}" + cr + cr + anchor)
mp = rep(mp, anchor, helper, "helper")
# 3. WM_SIZE: call helper instead of inline g_workers block
mp = rep(mp,
" if (ch != UINT32_MAX && g_workers) {" + cr + " auto wit = g_workers->find(ch);" + cr + " if (wit != g_workers->end()) {" + cr + " // onSize() must run on the channel worker (the view was attached" + cr + " // in its COM STA apartment), not on the main pump thread." + cr + " wit->second->post([ch, w, h]() {" + cr + " if (!g_engine) return;" + cr + " auto* i = g_engine->get(ch);" + cr + " if (i) i->resizeView(w, h);" + cr + " });" + cr + " }" + cr + " }" + cr + " return 0;",
" if (ch != UINT32_MAX) {" + cr + " post_resize_view(ch, w, h);" + cr + " }" + cr + " return 0;",
"wmsize")
save('native_bridge/src/main.cpp', mp)
print("OK")