-/* $Id$
- *
+/*
* PROJECT: ReactOS user32.dll
- * FILE: lib/user32/windows/clipboard.c
+ * FILE: win32ss/user/user32/windows/clipboard.c
* PURPOSE: Input
* PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
* Pablo Borobia <pborobia@gmail.com>
*
*/
-/* INCLUDES ******************************************************************/
-
#include <user32.h>
#define NDEBUG
-#include <wine/debug.h>
WINE_DEFAULT_DEBUG_CHANNEL(user32);
-#define QUERY_SIZE 0
+HANDLE WINAPI GdiConvertMetaFilePict(HANDLE);
+HANDLE WINAPI GdiConvertEnhMetaFile(HANDLE);
+HANDLE WINAPI GdiCreateLocalEnhMetaFile(HANDLE);
+HANDLE WINAPI GdiCreateLocalMetaFilePict(HANDLE);
-/* FUNCTIONS *****************************************************************/
/*
* @implemented
WINAPI
EnumClipboardFormats(UINT format)
{
+ SetLastError(NO_ERROR);
return NtUserxEnumClipboardFormats(format);
}
/* clear result string */
Length = 0;
}
- lpszFormatName[Length] = '\0';
+ lpszFormatName[Length] = ANSI_NULL;
}
RtlFreeHeap(RtlGetProcessHeap(), 0, lpBuffer);
WINAPI
RegisterClipboardFormatA(LPCSTR lpszFormat)
{
- UINT ret = 0;
+ UINT ret;
UNICODE_STRING usFormat = {0};
if (lpszFormat == NULL)
return 0;
}
- /* check for "" */
- if (*lpszFormat == 0) //NULL
+ if (*lpszFormat == ANSI_NULL)
{
SetLastError(ERROR_INVALID_NAME);
return 0;
}
- ret = RtlCreateUnicodeStringFromAsciiz(&usFormat, lpszFormat);
- if (ret)
+ if (!RtlCreateUnicodeStringFromAsciiz(&usFormat, lpszFormat))
{
- ret = NtUserRegisterWindowMessage(&usFormat); //(LPCWSTR)
- RtlFreeUnicodeString(&usFormat);
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return 0;
}
+ ret = NtUserRegisterWindowMessage(&usFormat); //(LPCWSTR)
+
+ RtlFreeUnicodeString(&usFormat);
+
return ret;
}
WINAPI
RegisterClipboardFormatW(LPCWSTR lpszFormat)
{
- UINT ret = 0;
UNICODE_STRING usFormat = {0};
if (lpszFormat == NULL)
return 0;
}
- /* check for "" */
- if (*lpszFormat == 0) //NULL
+ if (*lpszFormat == UNICODE_NULL)
{
SetLastError(ERROR_INVALID_NAME);
return 0;
}
RtlInitUnicodeString(&usFormat, lpszFormat);
- ret = NtUserRegisterWindowMessage(&usFormat);
-
- return ret;
+ return NtUserRegisterWindowMessage(&usFormat);
}
-PVOID static WINAPI
+static PVOID WINAPI
IntSynthesizeMultiByte(PVOID pwStr, DWORD cbStr, BOOL bOem)
{
HANDLE hGlobal;
return pGlobal;
}
-PVOID static WINAPI
+static PVOID WINAPI
IntSynthesizeWideChar(PVOID pwStr, DWORD cbStr, BOOL bOem)
{
HANDLE hGlobal;
if (!hData)
return NULL;
+ switch (uFormat)
+ {
+ case CF_DSPMETAFILEPICT:
+ case CF_METAFILEPICT:
+ return GdiCreateLocalMetaFilePict(hData);
+ case CF_DSPENHMETAFILE:
+ case CF_ENHMETAFILE:
+ return GdiCreateLocalEnhMetaFile(hData);
+ }
+
if (gcd.fGlobalHandle)
{
HANDLE hGlobal;
pData = pNewData;
}
- /* Save synthesized format in clibboard */
+ /* Save synthesized format in clipboard */
if (pData)
{
HANDLE hMem;
DWORD dwSize;
HANDLE hGlobal;
LPVOID pMem;
- HANDLE hRet = NULL;
+ HANDLE hRet = NULL, hTemp;
SETCLIPBDATA scd = {FALSE, FALSE};
- /* Check if this is delayed render */
+ /* Check if this is a delayed rendering */
if (hMem == NULL)
return NtUserSetClipboardData(uFormat, NULL, &scd);
else if (uFormat == CF_BITMAP || uFormat == CF_DSPBITMAP || uFormat == CF_PALETTE)
hRet = NtUserSetClipboardData(uFormat, hMem, &scd);
/* Meta files are probably checked for validity */
- else if (uFormat == CF_DSPMETAFILEPICT || uFormat == CF_METAFILEPICT ||
- uFormat == CF_DSPENHMETAFILE || uFormat == CF_ENHMETAFILE)
- hRet = NULL; // not supported yet
+ else if (uFormat == CF_DSPMETAFILEPICT || uFormat == CF_METAFILEPICT )
+ {
+ hTemp = GdiConvertMetaFilePict( hMem );
+ hRet = NtUserSetClipboardData(uFormat, hTemp, &scd); // Note : LOL, it returns a BOOL not a HANDLE!!!!
+ if (hRet == hTemp) hRet = hMem; // If successful "TRUE", return the original handle.
+ }
+ else if (uFormat == CF_DSPENHMETAFILE || uFormat == CF_ENHMETAFILE)
+ {
+ hTemp = GdiConvertEnhMetaFile( hMem );
+ hRet = NtUserSetClipboardData(uFormat, hTemp, &scd);
+ if (hRet == hTemp) hRet = hMem;
+ }
else
{
/* Some formats accept only global handles, other accept global handles or integer values */