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?