https://git.reactos.org/?p=reactos.git;a=commitdiff;h=6abc9f5b5af6cc7b7c57f…
commit 6abc9f5b5af6cc7b7c57ff9c6bcc4a919cf85d1e
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Sun Jul 1 00:12:23 2018 +0900
Commit: Hermès BÉLUSCA - MAÏTO <hermes.belusca-maito(a)reactos.org>
CommitDate: Sat Jun 30 17:12:23 2018 +0200
[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
---
win32ss/user/ntuser/clipboard.c | 47 ++++++++++++++++++++++++++---------------
1 file changed, 30 insertions(+), 17 deletions(-)
diff --git a/win32ss/user/ntuser/clipboard.c b/win32ss/user/ntuser/clipboard.c
index 92109953cc..04e5d22291 100644
--- a/win32ss/user/ntuser/clipboard.c
+++ b/win32ss/user/ntuser/clipboard.c
@@ -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);