Zhiyi Zhang (@zhiyi) commented about dlls/win32u/sysparams.c:
if (!(ret = user_driver->pChangeDisplaySettings( displays, hwnd, flags, lparam ))) + { + mode = displays; + LIST_FOR_EACH_ENTRY( adapter, &adapters, struct adapter, entry ) + { + if (!write_registry_settings( adapter->config_key, ENUM_CURRENT_SETTINGS, mode )) + WARN( "Failed to write adapter %s current mode.\n", debugstr_w(mode->dmDeviceName) ); + mode = NEXT_DEVMODEW(mode); + } + send_message_timeout( HWND_BROADCAST, WM_DISPLAYCHANGE, displays->dmBitsPerPel, MAKELPARAM( displays->dmPelsWidth, displays->dmPelsHeight ), SMTO_ABORTIFHUNG, 2000, FALSE ); + } + unlock_display_devices();
Right, it's probably best not to hold the display device lock while sending WM_DISPLAYCHANGE. The current behavior also doesn't guarantee WM_DISPLAYCHANGE ordering. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/551#note_7856