Don't try to activate a window in set_window_pos if it's set as active in GUITHREADINFO.
This prevents a window from getting reactivated when calling SetWindowPos inside the WM_ACTIVATE handler. For now I only was able to reproduce this by triggering a change in the active window from X11 with an alt-tab or by clicking another window, I was not able to write a wine test for this.
This test program works for reproducing it.
#include <windows.h>
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
if (uMsg == WM_ACTIVATE) {
SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
done:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine,
int nCmdShow) {
HWND hwnd;
const char CLASS_NAME[] = "class";
WNDCLASSA wc = {};
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
hwnd =
CreateWindowEx(0, CLASS_NAME, "test", 0,
4, 4, 1024, 768, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, SW_SHOW);
MSG msg;
while (TRUE) {
GetMessage(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}