Skip to content

Commit cc32e46

Browse files
committed
Merge pull request #101135 from Hilderin/fix-embedding-not-working-intermittently
Fix embedding failing intermittently
2 parents 0f76ee4 + 2f061df commit cc32e46

File tree

2 files changed

+4
-22
lines changed

2 files changed

+4
-22
lines changed

platform/linuxbsd/x11/display_server_x11.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -5720,7 +5720,7 @@ Error DisplayServerX11::embed_process(WindowID p_window, OS::ProcessID p_pid, co
57205720
}
57215721
}
57225722

5723-
if (desired_rect.size.x < 100 || desired_rect.size.y < 100) {
5723+
if (desired_rect.size.x <= 100 || desired_rect.size.y <= 100) {
57245724
p_visible = false;
57255725
}
57265726

platform/windows/display_server_windows.cpp

+3-21
Original file line numberDiff line numberDiff line change
@@ -2877,10 +2877,7 @@ static BOOL CALLBACK _enum_proc_find_window_from_process_id_callback(HWND hWnd,
28772877
GetWindowThreadProcessId(hWnd, &process_id);
28782878
if (ed.process_id == process_id) {
28792879
if (GetParent(hWnd) != ed.parent_hWnd) {
2880-
const DWORD style = GetWindowLongPtr(hWnd, GWL_STYLE);
2881-
if ((style & WS_VISIBLE) != WS_VISIBLE) {
2882-
return TRUE;
2883-
}
2880+
return TRUE;
28842881
}
28852882

28862883
// Found it.
@@ -2936,24 +2933,9 @@ Error DisplayServerWindows::embed_process(WindowID p_window, OS::ProcessID p_pid
29362933
ep->is_visible = (style & WS_VISIBLE) == WS_VISIBLE;
29372934

29382935
embedded_processes.insert(p_pid, ep);
2939-
2940-
HWND old_parent = GetParent(ep->window_handle);
2941-
if (old_parent != wd.hWnd) {
2942-
// It's important that the window does not have the WS_CHILD flag
2943-
// to prevent the current process from interfering with the embedded process.
2944-
// I observed lags and issues with mouse capture when WS_CHILD is set.
2945-
// Additionally, WS_POPUP must be set to ensure that the coordinates of the embedded
2946-
// window remain screen coordinates and not local coordinates of the parent window.
2947-
if ((style & WS_CHILD) == WS_CHILD || (style & WS_POPUP) != WS_POPUP) {
2948-
const DWORD new_style = (style & ~WS_CHILD) | WS_POPUP;
2949-
SetWindowLong(ep->window_handle, GWL_STYLE, new_style);
2950-
}
2951-
// Set the parent to current window.
2952-
SetParent(ep->window_handle, wd.hWnd);
2953-
}
29542936
}
29552937

2956-
if (p_rect.size.x < 100 || p_rect.size.y < 100) {
2938+
if (p_rect.size.x <= 100 || p_rect.size.y <= 100) {
29572939
p_visible = false;
29582940
}
29592941

@@ -2962,7 +2944,7 @@ Error DisplayServerWindows::embed_process(WindowID p_window, OS::ProcessID p_pid
29622944
// (e.g., a screen to the left of the main screen).
29632945
const Rect2i adjusted_rect = Rect2i(p_rect.position + _get_screens_origin(), p_rect.size);
29642946

2965-
SetWindowPos(ep->window_handle, HWND_BOTTOM, adjusted_rect.position.x, adjusted_rect.position.y, adjusted_rect.size.x, adjusted_rect.size.y, SWP_NOZORDER | SWP_NOACTIVATE);
2947+
SetWindowPos(ep->window_handle, nullptr, adjusted_rect.position.x, adjusted_rect.position.y, adjusted_rect.size.x, adjusted_rect.size.y, SWP_NOZORDER | SWP_NOACTIVATE | SWP_ASYNCWINDOWPOS);
29662948

29672949
if (ep->is_visible != p_visible) {
29682950
if (p_visible) {

0 commit comments

Comments
 (0)