https://git.reactos.org/?p=reactos.git;a=commitdiff;h=7278ed20159f95550b5bd0...
commit 7278ed20159f95550b5bd0468e2be453320f0359 Author: Hervé Poussineau hpoussin@reactos.org AuthorDate: Wed Sep 28 18:26:44 2022 +0200 Commit: Hervé Poussineau hpoussin@reactos.org CommitDate: Wed Sep 28 18:31:19 2022 +0200
[WIN32SS] Change LDEVOBJ_bProbeAndCaptureDevmode to account for not provided fields when searching an exact mode
This fixes mode change if an application requests (for example) 640x480x32, without providing display frequency. --- win32ss/gdi/eng/ldevobj.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-)
diff --git a/win32ss/gdi/eng/ldevobj.c b/win32ss/gdi/eng/ldevobj.c index 6408c20648f..803cbd37fe1 100644 --- a/win32ss/gdi/eng/ldevobj.c +++ b/win32ss/gdi/eng/ldevobj.c @@ -804,9 +804,9 @@ LDEVOBJ_bProbeAndCaptureDevmode( if (!bResult) return FALSE;
- if (bSearchClosestMode) + if (LDEVOBJ_bGetClosestMode(pGraphicsDevice, &dmSearch, &pdmSelected)) { - if (LDEVOBJ_bGetClosestMode(pGraphicsDevice, &dmSearch, &pdmSelected)) + if (bSearchClosestMode) { /* Ok, found a closest mode. Update search */ dmSearch.dmBitsPerPel = pdmSelected->dmBitsPerPel; @@ -814,6 +814,29 @@ LDEVOBJ_bProbeAndCaptureDevmode( dmSearch.dmPelsHeight = pdmSelected->dmPelsHeight; dmSearch.dmDisplayFrequency = pdmSelected->dmDisplayFrequency; } + else + { + /* Only update not provided fields */ + _SEH2_TRY + { + if (!(RequestedMode->dmFields & DM_BITSPERPEL) || RequestedMode->dmBitsPerPel == 0) + dmSearch.dmBitsPerPel = pdmSelected->dmBitsPerPel; + if (!(RequestedMode->dmFields & DM_PELSWIDTH) || RequestedMode->dmPelsWidth == 0) + dmSearch.dmPelsWidth = pdmSelected->dmPelsWidth; + if (!(RequestedMode->dmFields & DM_PELSHEIGHT) || RequestedMode->dmPelsHeight == 0) + dmSearch.dmPelsHeight = pdmSelected->dmPelsHeight; + if (!(RequestedMode->dmFields & DM_DISPLAYFREQUENCY) || RequestedMode->dmDisplayFrequency == 0) + dmSearch.dmDisplayFrequency = pdmSelected->dmDisplayFrequency; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + bResult = FALSE; + } + _SEH2_END; + + if (!bResult) + return FALSE; + } }
/* Now, search the exact mode to return to caller */