Zhiyi Zhang (@zhiyi) commented about dlls/win32u/sysparams.c:
ret = user_driver->pChangeDisplaySettings( displays, hwnd, flags, lparam );
free( displays ); + if (ret) return ret; + + if ((adapter = find_adapter( NULL ))) + { + DEVMODEW current_mode = {.dmSize = sizeof(DEVMODEW)}; + user_driver->pGetCurrentDisplaySettings( adapter->dev.device_name, ¤t_mode ); + adapter_release( adapter ); + + send_message_timeout( HWND_BROADCAST, WM_DISPLAYCHANGE, current_mode.dmBitsPerPel, + MAKELPARAM( current_mode.dmPelsWidth, current_mode.dmPelsHeight ), + SMTO_ABORTIFHUNG, 2000, FALSE );
As I said, sending WM_DISPLAYCHANGE with current_mode.dmBitsPerPel is probably wrong. Because on Windows, 8-bit and 16-bit display modes are emulated and Windows seems to use 32 instead when changing to 8-bit and 16-bit modes. Could you verify this? -- https://gitlab.winehq.org/wine/wine/-/merge_requests/844#note_8469