[WIN32SS] Fix NtUserGetClipboardData for text paste (#645)

Fix the NtUserGetClipboardData function for the synthesized text formats (CF_TEXT, CF_OEMTEXT and CF_UNICODETEXT).
CORE-11471
This commit is contained in:
Katayama Hirofumi MZ 2018-07-01 00:12:23 +09:00 committed by Hermès BÉLUSCA - MAÏTO
parent 2170901e6a
commit 6abc9f5b5a

View file

@ -294,8 +294,8 @@ IntAddSynthesizedFormats(PWINSTATION_OBJECT pWinStaObj)
bHaveBm = IntIsFormatAvailable(pWinStaObj, CF_BITMAP);
bHaveDib = IntIsFormatAvailable(pWinStaObj, CF_DIB);
/* Add CF_LOCALE format if we have CF_TEXT */
if (!bHaveLocale && bHaveText)
/* Add CF_LOCALE format if we have CF_TEXT, CF_OEMTEXT or CF_UNICODETEXT */
if (!bHaveLocale && (bHaveText || bHaveOemText || bHaveUniText))
{
PCLIPBOARDDATA pMemObj;
HANDLE hMem;
@ -881,6 +881,7 @@ NtUserGetClipboardData(UINT fmt, PGETCLIPBDATA pgcd)
HANDLE hRet = NULL;
PCLIP pElement;
PWINSTATION_OBJECT pWinStaObj;
UINT uSourceFmt = fmt;
TRACE("NtUserGetClipboardData(%x, %p)\n", fmt, pgcd);
@ -898,18 +899,7 @@ NtUserGetClipboardData(UINT fmt, PGETCLIPBDATA pgcd)
}
pElement = IntGetFormatElement(pWinStaObj, fmt);
if (pElement && IS_DATA_DELAYED(pElement) && pWinStaObj->spwndClipOwner)
{
/* Send WM_RENDERFORMAT message */
pWinStaObj->fInDelayedRendering = TRUE;
co_IntSendMessage(pWinStaObj->spwndClipOwner->head.h, WM_RENDERFORMAT, (WPARAM)fmt, 0);
pWinStaObj->fInDelayedRendering = FALSE;
/* Data should be in clipboard now */
pElement = IntGetFormatElement(pWinStaObj, fmt);
}
if (!pElement || IS_DATA_DELAYED(pElement))
if (!pElement)
goto cleanup;
if (IS_DATA_SYNTHESIZED(pElement))
@ -921,20 +911,43 @@ NtUserGetClipboardData(UINT fmt, PGETCLIPBDATA pgcd)
case CF_UNICODETEXT:
case CF_TEXT:
case CF_OEMTEXT:
pElement = IntGetFormatElement(pWinStaObj, CF_UNICODETEXT);
uSourceFmt = CF_UNICODETEXT;
pElement = IntGetFormatElement(pWinStaObj, uSourceFmt);
if (IS_DATA_SYNTHESIZED(pElement))
pElement = IntGetFormatElement(pWinStaObj, CF_TEXT);
{
uSourceFmt = CF_TEXT;
pElement = IntGetFormatElement(pWinStaObj, uSourceFmt);
}
if (IS_DATA_SYNTHESIZED(pElement))
pElement = IntGetFormatElement(pWinStaObj, CF_OEMTEXT);
{
uSourceFmt = CF_OEMTEXT;
pElement = IntGetFormatElement(pWinStaObj, uSourceFmt);
}
break;
case CF_BITMAP:
IntSynthesizeBitmap(pWinStaObj, pElement);
break;
default:
ASSERT(FALSE);
}
}
if (pElement && IS_DATA_DELAYED(pElement) && pWinStaObj->spwndClipOwner)
{
/* Send WM_RENDERFORMAT message */
pWinStaObj->fInDelayedRendering = TRUE;
co_IntSendMessage(pWinStaObj->spwndClipOwner->head.h, WM_RENDERFORMAT, (WPARAM)uSourceFmt, 0);
pWinStaObj->fInDelayedRendering = FALSE;
/* Data should be in clipboard now */
pElement = IntGetFormatElement(pWinStaObj, uSourceFmt);
}
if (!pElement || IS_DATA_DELAYED(pElement))
goto cleanup;
_SEH2_TRY
{
ProbeForWrite(pgcd, sizeof(*pgcd), 1);