diff options
Diffstat (limited to '')
-rw-r--r-- | private/mvdm/wow32/wuclip.c | 1245 |
1 files changed, 1245 insertions, 0 deletions
diff --git a/private/mvdm/wow32/wuclip.c b/private/mvdm/wow32/wuclip.c new file mode 100644 index 000000000..b33d49a06 --- /dev/null +++ b/private/mvdm/wow32/wuclip.c @@ -0,0 +1,1245 @@ +/*++ + * + * WOW v1.0 + * + * Copyright (c) 1991, Microsoft Corporation + * + * WUCLIP.C + * WOW32 16-bit User API support + * + * History: + * WOW Clipboard functionality designed and developed by ChandanC + * +--*/ + + +#include "precomp.h" +#pragma hdrstop + +struct _CBFORMATS ClipboardFormats; + +DLLENTRYPOINTS OleStringConversion[WOW_OLESTRINGCONVERSION_COUNT] = + {"ConvertObjDescriptor", NULL}; + + + +UINT CFOLEObjectDescriptor; +UINT CFOLELinkSrcDescriptor; + + +MODNAME(wuclip.c); + + +/*++ + BOOL ChangeClipboardChain(<hwnd>, <hwndNext>) + HWND <hwnd>; + HWND <hwndNext>; + + The %ChangeClipboardChain% function removes the window specified by the + <hwnd> parameter from the chain of clipboard viewers and makes the window + specified by the <hwndNext> parameter the descendant of the <hwnd> + parameter's ancestor in the chain. + + <hwnd> + Identifies the window that is to be removed from the chain. The handle + must previously have been passed to the SetClipboardViewer function. + + <hwndNext> + Identifies the window that follows <hwnd> in the clipboard-viewer + chain (this is the handle returned by the %SetClipboardViewer% function, + unless the sequence was changed in response to a WM_CHANGECBCHAIN + message). + + The return value specifies the status of the <hwnd> window. It is TRUE if + the window is found and removed. Otherwise, it is FALSE. +--*/ + +ULONG FASTCALL WU32ChangeClipboardChain(PVDMFRAME pFrame) +{ + ULONG ul; + register PCHANGECLIPBOARDCHAIN16 parg16; + + GETARGPTR(pFrame, sizeof(CHANGECLIPBOARDCHAIN16), parg16); + + ul = GETBOOL16(ChangeClipboardChain( + HWND32(parg16->f1), + HWND32(parg16->f2) + )); + + FREEARGPTR(parg16); + RETURN(ul); +} + + +/*++ + BOOL CloseClipboard(VOID) + + The %CloseClipboard% function closes the clipboard. The %CloseClipboard% + function should be called when a window has finished examining or changing + the clipboard. It lets other applications access the clipboard. + + This function has no parameters. + + The return value specifies whether the clipboard is closed. It is TRUE if + the clipboard is closed. Otherwise, it is FALSE. +--*/ + +ULONG FASTCALL WU32CloseClipboard(PVDMFRAME pFrame) +{ + ULONG ul; + + UNREFERENCED_PARAMETER(pFrame); + + ul = GETBOOL16(CloseClipboard()); + + RETURN(ul); +} + + +/*++ + No REF header file +--*/ + +ULONG FASTCALL WU32CountClipboardFormats(PVDMFRAME pFrame) +{ + ULONG ul; + + UNREFERENCED_PARAMETER(pFrame); + + ul = GETINT16(CountClipboardFormats()); + + RETURN(ul); +} + + +/*++ + BOOL EmptyClipboard(VOID) + + The %EmptyClipboard% function empties the clipboard and frees handles to + data in the clipboard. It then assigns ownership of the clipboard to the + window that currently has the clipboard open. + + This function has no parameters. + + The return value specifies the status of the clipboard. It is TRUE if the + clipboard is emptied. It is FALSE if an error occurs. + + The clipboard must be open when the %EmptyClipboard% function is called. +--*/ + +ULONG FASTCALL WU32EmptyClipboard(PVDMFRAME pFrame) +{ + ULONG ul; + + UNREFERENCED_PARAMETER(pFrame); + + ul = GETBOOL16(EmptyClipboard()); + + W32EmptyClipboard (); + + RETURN(ul); +} + + +/*++ + WORD EnumClipboardFormats(<wFormat>) + WORD <wFormat>; + + The %EnumClipboardFormats% function enumerates the formats found in a list + of available formats that belong to the clipboard. On each call to this + function, the <wFormat> parameter specifies a known available format, and + the function returns the format that appears next in the list. The first + format in the list can be retrieved by setting <wFormat> to zero. + + <wFormat> + Specifies a known format. + + The return value specifies the next known clipboard data format. It is zero + if <wFormat> specifies the last format in the list of available formats. It + is zero if the clipboard is not open. + + Before it enumerates the formats by using the %EnumClipboardFormats% + function, an application must open the clipboard by using the + %OpenClipboard% function. + + The order that an application uses for putting alternative formats for the + same data into the clipboard is the same order that the enumerator uses when + returning them to the pasting application. The pasting application should + use the first format enumerated that it can handle. This gives the donor a + chance to recommend formats that involve the least loss of data. +--*/ + +ULONG FASTCALL WU32EnumClipboardFormats(PVDMFRAME pFrame) +{ + ULONG ul; + register PENUMCLIPBOARDFORMATS16 parg16; + + GETARGPTR(pFrame, sizeof(ENUMCLIPBOARDFORMATS16), parg16); + + ul = GETWORD16(EnumClipboardFormats( + WORD32(parg16->f1) + )); + + FREEARGPTR(parg16); + RETURN(ul); +} + + +/*++ + HANDLE GetClipboardData(<wFormat>) + WORD <wFormat>; + + The %GetClipboardData% function retrieves data from the clipboard in the + format given by the <wFormat> parameter. The clipboard must have been opened + previously. + + <wFormat> + Specifies a data format. For a description of the data formats, see the + SetClipboardData function, later in this chapter. + + The return value identifies the memory block that contains the data from the + clipboard. The handle type depends on the type of data specified by the + <wFormat> parameter. It is NULL if there is an error. + + The available formats can be enumerated in advance by using the + %EnumClipboardFormats% function. + + The data handle returned by %GetClipboardData% is controlled by the + clipboard, not by the application. The application should copy the data + immediately, instead of relying on the data handle for long-term use. The + application should not free the data handle or leave it locked. + + Windows supports two formats for text, CF_TEXT and CF_OEMTEXT. CF_TEXT is + the default Windows text clipboard format, while Windows uses the CF_OEMTEXT + format for text in non-Windows applications. If you call %GetClipboardData% + to retrieve data in one text format and the other text format is the only + available text format, Windows automatically converts the text to the + requested format before supplying it to your application. + + If the clipboard contains data in the CF_PALETTE (logical color palette) + format, the application should assume that any other data in the clipboard + is realized against that logical palette. +--*/ + +ULONG FASTCALL WU32GetClipboardData(PVDMFRAME pFrame) +{ + ULONG ul = 0; + HANDLE hMem32, hMeta32 = 0; + HMEM16 hMem16=0, hMeta16 = 0; + VPVOID vp; + LPBYTE lpMem32; + LPBYTE lpMem16; + int cb; + register PGETCLIPBOARDDATA16 parg16; + + GETARGPTR(pFrame, sizeof(GETCLIPBOARDDATA16), parg16); + + LOGDEBUG(6, ("WOW::WUICBGetClipboardData(): CF_FORMAT is %04x\n", parg16->f1)); + + switch (parg16->f1) { + + // This is intentional to let it thru to the "case statements". + // ChandanC 5/11/92. + + default: + if ((parg16->f1 == CFOLEObjectDescriptor) || (parg16->f1 == CFOLELinkSrcDescriptor)) { + hMem32 = GetClipboardData(WORD32(parg16->f1)); + if (hMem32) { + hMem16 = (HMEM16) W32ConvertObjDescriptor(hMem32, CFOLE_UNICODE_TO_ANSI); + } + WU32ICBStoreHandle(parg16->f1, hMem16); + break; + } + + case CF_DIB: + case CF_TEXT: + case CF_DSPTEXT: + case CF_SYLK: + case CF_DIF: + case CF_TIFF: + case CF_OEMTEXT: + case CF_PENDATA: + case CF_RIFF: + case CF_WAVE: + case CF_OWNERDISPLAY: + hMem16 = WU32ICBGetHandle(parg16->f1); + if (!hMem16) { + hMem32 = GetClipboardData(WORD32(parg16->f1)); + + if (hMem16 = WU32ICBGetHandle(parg16->f1)) { + + // + // We couldn't find the hMem16 using WU32ICBGetHandle + // before we called Win32 GetClipboardData, but we can + // now, so that means it was cut/copied from a task in + // this WOW using delayed rendering, so that the actual + // non-NULL hMem16 wasn't SetClipboardData until we + // just called GetClipboardData. Since we now have + // a valid cached copy of the data in 16-bit land, + // we can just return that. + // + + break; + } + + if (hMem32) { + lpMem32 = GlobalLock(hMem32); + cb = GlobalSize(hMem32); + vp = GlobalAllocLock16(GMEM_MOVEABLE | GMEM_DDESHARE, cb, &hMem16); + // 16-bit memory may have moved - refresh flat pointers + FREEARGPTR(parg16); + FREEVDMPTR(pFrame); + GETFRAMEPTR(((PTD)CURRENTPTD())->vpStack, pFrame); + GETARGPTR(pFrame, sizeof(GETCLIPBOARDDATA16), parg16); + if (vp) { + GETMISCPTR(vp, lpMem16); + RtlCopyMemory(lpMem16, lpMem32, cb); + GlobalUnlock16(hMem16); + FLUSHVDMPTR(vp, cb, lpMem16); + FREEMISCPTR(lpMem16); + } + GlobalUnlock(hMem32); + } + + WU32ICBStoreHandle(parg16->f1, hMem16); + } + break; + + case CF_HDROP: + // This is the case when app is retrieving cf_hdrop from the + // clipboard, thus we will convert the dropfiles structure + // from 32 to 16-bit one + hMem16 = WU32ICBGetHandle(parg16->f1); + if (!hMem16) { + hMem32 = GetClipboardData(WORD32(parg16->f1)); + if (hMem32) { + hMem16 = CopyDropFilesFrom32(hMem32); + } + WU32ICBStoreHandle(parg16->f1, hMem16); + } + break; + + case CF_DSPBITMAP: + case CF_BITMAP: + hMem16 = GETHBITMAP16(GetClipboardData(WORD32(parg16->f1))); + break; + + case CF_PALETTE: + hMem16 = GETHPALETTE16(GetClipboardData(WORD32(parg16->f1))); + break; + + case CF_DSPMETAFILEPICT: + case CF_METAFILEPICT: + hMem16 = WU32ICBGetHandle(parg16->f1); + if (!(hMem16)) { + hMem32 = GetClipboardData(WORD32(parg16->f1)); + + if (hMem16 = WU32ICBGetHandle(parg16->f1)) { + + // + // We couldn't find the hMem16 using WU32ICBGetHandle + // before we called Win32 GetClipboardData, but we can + // now, so that means it was cut/copied from a task in + // this WOW using delayed rendering, so that the actual + // non-NULL hMem16 wasn't SetClipboardData until we + // just called GetClipboardData. Since we now have + // a valid cached copy of the data in 16-bit land, + // we can just return that. + // + + break; + } + + if (hMem32) { + lpMem32 = GlobalLock(hMem32); + vp = GlobalAllocLock16(GMEM_MOVEABLE | GMEM_DDESHARE, sizeof(METAFILEPICT16), &hMem16); + // 16-bit memory may have moved - refresh flat pointers + FREEARGPTR(parg16); + FREEVDMPTR(pFrame); + GETFRAMEPTR(((PTD)CURRENTPTD())->vpStack, pFrame); + GETARGPTR(pFrame, sizeof(GETCLIPBOARDDATA16), parg16); + if (vp) { + GETMISCPTR(vp, lpMem16); + FixMetafile32To16 ((LPMETAFILEPICT) lpMem32, (LPMETAFILEPICT16) lpMem16); + FREEMISCPTR(lpMem16); + + hMeta32 = ((LPMETAFILEPICT) lpMem32)->hMF; + if (hMeta32) { + hMeta16 = WinMetaFileFromHMF(hMeta32, FALSE); + // 16-bit memory may have moved + FREEARGPTR(parg16); + FREEVDMPTR(pFrame); + GETFRAMEPTR(((PTD)CURRENTPTD())->vpStack, pFrame); + GETARGPTR(pFrame, sizeof(GETCLIPBOARDDATA16), parg16); + } + + GETMISCPTR(vp, lpMem16); + STOREWORD(((LPMETAFILEPICT16) lpMem16)->hMF, hMeta16); + GlobalUnlock16(hMem16); + FLUSHVDMPTR(vp, sizeof(METAFILEPICT16), lpMem16); + FREEMISCPTR(lpMem16); + } + GlobalUnlock(hMem32); + } + WU32ICBStoreHandle(parg16->f1, hMem16); + } + break; + } + + ul = (ULONG) hMem16; + + FREEARGPTR(parg16); + RETURN(ul); +} + + +/*++ + int GetClipboardFormatName(<wFormat>, <lpFormatName>, <nMaxCount>) + WORD <wFormat>; + LPSTR <lpFormatName>; + int <nMaxCount>; + + The %GetClipboardFormatName% function retrieves from the clipboard the name + of the registered format specified by the <wFormat> parameter. The name is + copied to the buffer pointed to by the <lpFormatName> parameter. + + <wFormat> + Specifies the type of format to be retrieved. It must not specify any of + the predefined clipboard formats. + + <lpFormatName> + Points to the buffer that is to receive the format name. + + <nMaxCount> + Specifies the maximum length (in bytes) of the string to be copied + to the buffer. If the actual name is longer, it is truncated. + + The return value specifies the actual length of the string copied to the + buffer. It is zero if the requested format does not exist or is a predefined + format. +--*/ + +ULONG FASTCALL WU32GetClipboardFormatName(PVDMFRAME pFrame) +{ + ULONG ul; + PSZ psz2 = NULL; + register PGETCLIPBOARDFORMATNAME16 parg16; + + GETARGPTR(pFrame, sizeof(GETCLIPBOARDFORMATNAME16), parg16); + ALLOCVDMPTR(parg16->f2, parg16->f3, psz2); + + ul = GETINT16(GetClipboardFormatName( + WORD32(parg16->f1), + psz2, + INT32(parg16->f3) + )); + + FLUSHVDMPTR(parg16->f2, strlen(psz2)+1, psz2); + FREEVDMPTR(psz2); + FREEARGPTR(parg16); + RETURN(ul); +} + + +/*++ + HWND GetClipboardOwner(VOID) + + The %GetClipboardOwner% function retrieves the window handle of the current + owner of the clipboard. + + This function has no parameters. + + The return value identifies the window that owns the clipboard. It is NULL + if the clipboard is not owned. + + The clipboard can still contain data even if the clipboard is not currently + owned. +--*/ + +ULONG FASTCALL WU32GetClipboardOwner(PVDMFRAME pFrame) +{ + ULONG ul; + + UNREFERENCED_PARAMETER(pFrame); + + ul = GETHWND16(GetClipboardOwner()); + + RETURN(ul); +} + + +/*++ + HWND GetClipboardViewer(VOID) + + The %GetClipboardViewer% function retrieves the window handle of the first + window in the clipboard-viewer chain. + + This function has no parameters. + + The return value identifies the window currently responsible for displaying + the clipboard. It is NULL if there is no viewer. +--*/ + +ULONG FASTCALL WU32GetClipboardViewer(PVDMFRAME pFrame) +{ + ULONG ul; + + UNREFERENCED_PARAMETER(pFrame); + + ul = GETHWND16(GetClipboardViewer()); + + RETURN(ul); +} + + +/*++ + int GetPriorityClipboardFormat(<lpPriorityList>, <cEntries>) + LPWORD <lpPriorityList>; + int <cEntries>; + + The %GetPriorityClipboardFormat% function returns the first clipboard format + in a list for which data exist in the clipboard. + + <lpPriorityList> + Points to an integer array that contains a list of clipboard formats in + priority order. For a description of the data formats, see the + SetClipboardData function later in this chapter. + + <cEntries> + Specifies the number of entries in <lpPriorityList>. This value + must not be greater than the actual number of entries in the list. + + The return value is the highest priority clipboard format in the list for + which data exist. If no data exist in the clipboard, this function returns + NULL. If data exist in the clipboard which did not match any format in the + list, the return value is -1. +--*/ + +ULONG FASTCALL WU32GetPriorityClipboardFormat(PVDMFRAME pFrame) +{ + ULONG ul; + UINT *pu1; + register PGETPRIORITYCLIPBOARDFORMAT16 parg16; + INT BufferT[256]; // comfortably large array + + + GETARGPTR(pFrame, sizeof(GETPRIORITYCLIPBOARDFORMAT16), parg16); + pu1 = STACKORHEAPALLOC(parg16->f2 * sizeof(INT), sizeof(BufferT), BufferT); + getuintarray16(parg16->f1, parg16->f2, pu1); + + if (pu1) { + ul = GETINT16(GetPriorityClipboardFormat( + pu1, + INT32(parg16->f2) + )); + } else { + ul = (ULONG)-1; + } + + STACKORHEAPFREE(pu1, BufferT); + FREEARGPTR(parg16); + RETURN(ul); +} + + +/*++ + BOOL IsClipboardFormatAvailable(<wFormat>) + WORD <wFormat>; + + The %IsClipboardFormatAvailable% function specifies whether data of a + certain type exist in the clipboard. + + <wFormat> + Specifies a registered clipboard format. For information on clipboard + formats, see the description of the SetClipboardData function, later in + this chapter. + + The return value specifies the outcome of the function. It is TRUE if data + having the specified format are present. Otherwise, it is FALSE. + + This function is typically called during processing of the WM_INITMENU or + WM_INITMENUPOPUP message to determine whether the clipboard contains data + that the application can paste. If such data are present, the application + typically enables the Paste command (in its Edit menu). +--*/ + +ULONG FASTCALL WU32IsClipboardFormatAvailable(PVDMFRAME pFrame) +{ + ULONG ul; + register PISCLIPBOARDFORMATAVAILABLE16 parg16; + + GETARGPTR(pFrame, sizeof(ISCLIPBOARDFORMATAVAILABLE16), parg16); + + // Hack-a-roo! PhotoShop 2.5 has a bug in its code for handling large DIB's + // on the clipboard and will fault if it encounters one. On WFW, it usually + // won't encounter one because most apps (in this case alt-Prtscrn button) + // copy BITMAPS, not DIBS, to the clipboard. On NT, anytime an app writes + // a BITMAP to the clipboard it gets converted to a DIB & vice versa-making + // more clipboard data formats available to inquiring apps. Unfortunately, + // Photoshop checks for DIBS before BITMAPS and finds one on Win + // Versions >= 4.0. a-craigj + + // if this is a DIB check && the app is PhotoShop... + if((WORD32(parg16->f1) == CF_DIB) && + (CURRENTPTD()->dwWOWCompatFlagsEx & WOWCFEX_NODIBSHERE)) { + + // ...see if there is a bitmap format available too + if(IsClipboardFormatAvailable(CF_BITMAP)) { + + // if so return FALSE which will cause Photoshop to ask for a + // BITMAP format next + ul = FALSE; + } + + // otherwise we'll check for a DIB anyway & hope it's a small one + else { + ul = GETBOOL16(IsClipboardFormatAvailable(CF_DIB)); + } + } + + // no hack path + else { + ul = GETBOOL16(IsClipboardFormatAvailable(WORD32(parg16->f1))); + } + + FREEARGPTR(parg16); + RETURN(ul); +} + + +/*++ + BOOL OpenClipboard(<hwnd>) + HWND <hwnd>; + + The %OpenClipboard% function opens the clipboard. Other applications will + not be able to modify the clipboard until the %CloseClipboard% function is + called. + + <hwnd> + Identifies the window to be associated with the open clipboard. + + The return value is TRUE if the clipboard is opened, or FALSE if another + application or window has the clipboard opened. + + The window specified by the <hwnd> parameter will not become the owner of + the clipboard until the %EmptyCLipboard% function is called. +--*/ + +ULONG FASTCALL WU32OpenClipboard(PVDMFRAME pFrame) +{ + ULONG ul; + register POPENCLIPBOARD16 parg16; + + GETARGPTR(pFrame, sizeof(OPENCLIPBOARD16), parg16); + + ul = GETBOOL16(OpenClipboard( + HWND32(parg16->f1) + )); + + FREEARGPTR(parg16); + RETURN(ul); +} + + +/*++ + WORD RegisterClipboardFormat(<lpFormatName>) + LPSTR <lpFormatName>; + + The %RegisterClipboardFormat% function registers a new clipboard format + whose name is pointed to by the <lpFormatName> parameter. The registered + format can be used in subsequent clipboard functions as a valid format in + which to render data, and it will appear in the clipboard's list of + formats. + + <lpFormatName> + Points to a character string that names the new format. The string must + be a null-terminated string. + + The return value specifies the newly registered format. If the identical + format name has been registered before, even by a different application, the + format's reference count is increased and the same value is returned as when + the format was originally registered. The return value is zero if the format + cannot be registered. + + The format value returned by the %RegisterClipboardFormat% function is + within the range of 0xC000 to 0xFFFF. +--*/ + +ULONG FASTCALL WU32RegisterClipboardFormat(PVDMFRAME pFrame) +{ + ULONG ul; + PSZ psz1; + register PREGISTERCLIPBOARDFORMAT16 parg16; + + GETARGPTR(pFrame, sizeof(REGISTERCLIPBOARDFORMAT16), parg16); + GETPSZPTR(parg16->f1, psz1); + + ul = GETWORD16(RegisterClipboardFormat( + psz1 + )); + + FREEPSZPTR(psz1); + FREEARGPTR(parg16); + RETURN(ul); +} + + +/*++ + HANDLE SetClipboardData(<wFormat>, <hData>) + WORD <wFormat>; + HANDLE <hData>; + + The %SetClipboardData% function sets the data in the clipboard. The + application must have called the %OpenClipboard% function before calling + the %SetClipboardData% function. + + <wFormat> + Specifies the format of the data. It can be any one of the + system-defined formats, or a format registered by the + %RegisterClipboardFormat% function. For a list of system-defined + formats, + + <hData> + Identifies the data to be placed into the clipboard. For all formats + except CF_BITMAP and CF_PALETTE, this parameter must be a handle to + memory allocated by the %GlobalAlloc% function. For CF_BITMAP format, + the <hData> parameter is a handle to a bitmap (see %LoadBitmap%). For + CF_PALETTE format, the <hData> parameter is a handle to a palette (see + %CreatePalette%). + + If this parameter is NULL, the owner of the clipboard will be sent a + WM_RENDERFORMAT message when it needs to supply the data. + + The return value is a handle to the data if the function is succesful, or + NULL if an error occurred. + + If the <hData> parameter contains a handle to memory allocated by the + %GlobalAlloc% function, the application must not use this handle once it + has called the %SetClipboardData% function. + + The following list contains the system-defined clipboard formats: + + CF_BITMAP + The data is a bitmap. + + CF_DIB + The data is a memory block containing a %BITMAPINFO% structure followed + by the bitmap data. + + CF_DIF + The data is in Software Arts' Data Interchange Format. + + CF_DSPBITMAP + The data is a bitmap representation of a private format. This data is + displayed in bitmap format in lieu of the privately formatted data. + + CF_DSPMETAFILEPICT + The data is a metafile representation of a private data format. This + data is displayed in metafile-picture format in lieu of the privately + formatted data. + + CF_DSPTEXT + The data is a textual representation of a private data format. This data + is displayed in text format in lieu of the privately formatted data. + + CF_METAFILEPICT + The data is a metafile (see description of the %METAFILEPICT% + structure). + + CF_OEMTEXT + The data is an array of text characters in the OEM character set. Each + line ends with a carriage return/linefeed (CR-LF) combination. A null + character signals the end of the data. + + CF_OWNERDISPLAY + The data is in a private format that the clipboard owner must display. + + CF_PALETTE + The data is a color palette. + + CF_SYLK + The data is in Microsoft Symbolic Link (SYLK) format. + + CF_TEXT + The data is an array of text characters. Each line ends with a carriage + return/linefeed (CR-LF) combination. A null character signals the end of + the data. + + CF_TIFF + The data is in Tag Image File Format. + + Private data formats in the range of CF_PRIVATEFIRST to CF_PRIVATELAST are + not automatically freed when the data is deleted from the clipboard. Data + handles associated with these formats should be freed upon receiving a + WM_DESTROYCLIPBOARD message. + + Private data formats in the range of CF_GDIOBJFIRST to CF_GDIOBJLAST will + be automatically deleted with a call to %DeleteObject% when the data is + deleted from the clipboard. + + If the Windows clipboard application is running, it will not update its + window to show the data placed in the clipboard by the %SetClipboardData% + until after the %CloseClipboard% function is called. + + 31-Oct-1990 [ralphw] Miscelanious material, needs to be moved to other + function descriptions/overviews. + + Whenever an application places data in the clipboard that depends on or + assumes a color palette, it should also place the palette in the + clipboard as well. + + If the clipboard contains data in the CF_PALETTE (logical color palette) + format, the application should assume that any other data in the + clipboard is realized against that logical palette. + + The clipboard-viewer application (CLIPBRD.EXE) always uses as its + current palette any object in CF_PALETTE format that is in the clipboard + when it displays the other formats in the clipboard. + + Windows supports two formats for text, CF_TEXT and CF_OEMTEXT. CF_TEXT + is the default Windows text clipboard format, while Windows uses the + CF_OEMTEXT format for text in non-Windows applications. If you call + %GetClipboardData% to retrieve data in one text format and the other + text format is the only available text format, Windows automatically + converts the text to the requested format before supplying it to your + application. + + An application registers other standard formats, such as Rich Text + Format (RTF), by name using the %RegisterClipboardFormat% function + rather than by a symbolic constant. For information on these external + formats, see the README.TXT file. +--*/ + +ULONG FASTCALL WU32SetClipboardData(PVDMFRAME pFrame) +{ + ULONG ul = 0; + HANDLE hMem32 = NULL, hMF32 = NULL; + HAND16 hMem16, hMeta16 = 0; + LPBYTE lpMem16, lpMem32; + INT cb; + VPVOID vp; + + + register PSETCLIPBOARDDATA16 parg16; + + GETARGPTR(pFrame, sizeof(SETCLIPBOARDDATA16), parg16); + + LOGDEBUG(6, ("WOW::WUICBSetClipboardData(): CF_FORMAT is %04x\n", parg16->f1)); + + switch (parg16->f1) { + + default: + if ((parg16->f1 == CFOLEObjectDescriptor) || (parg16->f1 == CFOLELinkSrcDescriptor)) { + if (parg16->f2) { + hMem32 = W32ConvertObjDescriptor((HANDLE) parg16->f2, CFOLE_ANSI_TO_UNICODE); + } + ul = (ULONG) SetClipboardData(WORD32(parg16->f1), hMem32); + WU32ICBStoreHandle(parg16->f1, parg16->f2); + break; + } + + // It is intentional to let it thru to the "case statements". + // ChandanC 5/11/92. + + case CF_DIB: + case CF_TEXT: + case CF_DSPTEXT: + case CF_SYLK: + case CF_DIF: + case CF_TIFF: + case CF_OEMTEXT: + case CF_PENDATA: + case CF_RIFF: + case CF_WAVE: + case CF_OWNERDISPLAY: + hMem16 = parg16->f2; + if (hMem16) { + vp = GlobalLock16(hMem16, &cb); + if (vp) { + GETMISCPTR(vp, lpMem16); + hMem32 = Copyh16Toh32 (cb, lpMem16); + GlobalUnlock16(hMem16); + FREEMISCPTR(lpMem16); + } + } + + ul = (ULONG) SetClipboardData(WORD32(parg16->f1), hMem32); + + WU32ICBStoreHandle(parg16->f1, hMem16); + break; + + case CF_HDROP: + // support cf_hdrop format by converting the dropfiles structure + hMem16 = parg16->f2; + if (hMem16) { + hMem32 = CopyDropFilesFrom16(hMem16); + } + ul = (ULONG)SetClipboardData(WORD32(parg16->f1), hMem32); + WU32ICBStoreHandle(parg16->f1, hMem16); + break; + + case CF_DSPBITMAP: + case CF_BITMAP: + ul = (ULONG) SetClipboardData(WORD32(parg16->f1), + HBITMAP32(parg16->f2)); + break; + + + case CF_PALETTE: + ul = (ULONG) SetClipboardData(WORD32(parg16->f1), + HPALETTE32(parg16->f2)); + break; + + case CF_DSPMETAFILEPICT: + case CF_METAFILEPICT: + hMem16 = parg16->f2; + if (hMem16) { + vp = GlobalLock16(hMem16, &cb); + if (vp) { + GETMISCPTR(vp, lpMem16); + hMem32 = GlobalAlloc(GMEM_DDESHARE, sizeof(METAFILEPICT)); + WOW32ASSERT(hMem32); + if (hMem32) { + lpMem32 = GlobalLock(hMem32); + ((LPMETAFILEPICT) lpMem32)->mm = FETCHSHORT(((LPMETAFILEPICT16) lpMem16)->mm); + ((LPMETAFILEPICT) lpMem32)->xExt = (LONG) FETCHSHORT(((LPMETAFILEPICT16) lpMem16)->xExt); + ((LPMETAFILEPICT) lpMem32)->yExt = (LONG) FETCHSHORT(((LPMETAFILEPICT16) lpMem16)->yExt); + hMeta16 = FETCHWORD(((LPMETAFILEPICT16) lpMem16)->hMF); + if (hMeta16) { + hMF32 = (HMETAFILE) HMFFromWinMetaFile(hMeta16, FALSE); + } + ((LPMETAFILEPICT) lpMem32)->hMF = hMF32; + GlobalUnlock(hMem32); + } + GlobalUnlock16(hMem16); + FREEMISCPTR(lpMem16); + } + + } + + ul = (ULONG) SetClipboardData(WORD32(parg16->f1), hMem32); + + WU32ICBStoreHandle(parg16->f1, hMem16); + break; + + } + + if (parg16->f2) { + ul = parg16->f2; + } + + FREEARGPTR(parg16); + RETURN(ul); +} + + + +/*++ + HWND SetClipboardViewer(<hwnd>) + HWND <hwnd>; + + The %SetClipboardViewer% function adds the window specified by the <hwnd> + parameter to the chain of windows that are notified (via the + WM_DRAWCLIPBOARD message) whenever the contents of the clipboard are + changed. + + <hwnd> + Identifies the window to receive clipboard-viewer chain messages. + + The return value identifies the next window in the clipboard-viewer chain. + This handle should be saved in static memory and used in responding to + clipboard-viewer chain messages. + + Windows that are part of the clipboard-viewer chain must respond to + WM_CHANGECBCHAIN, WM_DRAWCLIPBOARD, and WM_DESTROY messages. + + If an application wishes to remove itself from the clipboard-viewer chain, + it must call the %ChangeClipboardChain% function. +--*/ + +ULONG FASTCALL WU32SetClipboardViewer(PVDMFRAME pFrame) +{ + ULONG ul; + register PSETCLIPBOARDVIEWER16 parg16; + + GETARGPTR(pFrame, sizeof(SETCLIPBOARDVIEWER16), parg16); + + ul = GETHWND16(SetClipboardViewer(HWND32(parg16->f1))); + + FREEARGPTR(parg16); + RETURN(ul); +} + + +VOID WU32ICBStoreHandle(WORD wFormat, HMEM16 hMem16) +{ + HAND16 h16, hMeta16; + PCBNODE Temp, Temp1; + LPBYTE lpMem16; + VPVOID vp; + int cb; + + + if ((wFormat == CF_METAFILEPICT) || (wFormat == CF_DSPMETAFILEPICT)) { + if (wFormat == CF_METAFILEPICT) { + h16 = ClipboardFormats.Pre1[wFormat]; + } + else { + h16 = ClipboardFormats.Pre2[3]; + } + + if (h16) { + vp = GlobalLock16(h16, &cb); + if (vp) { + GETMISCPTR(vp, lpMem16); + hMeta16 = FETCHWORD(((LPMETAFILEPICT16) lpMem16)->hMF); + GlobalUnlockFree16(GlobalLock16(hMeta16, NULL)); + } + GlobalUnlockFree16(vp); + + if (wFormat == CF_METAFILEPICT) { + ClipboardFormats.Pre1[wFormat] = 0; + } + else { + ClipboardFormats.Pre2[3] = 0; + } + } + } + + if ((wFormat >= CF_TEXT ) && (wFormat <= CF_WAVE)) { + if (ClipboardFormats.Pre1[wFormat]) { + GlobalUnlockFree16(GlobalLock16(ClipboardFormats.Pre1[wFormat], NULL)); + } + ClipboardFormats.Pre1[wFormat] = hMem16; + } + else if ((wFormat >= CF_OWNERDISPLAY) && (wFormat <= CF_DSPMETAFILEPICT)) { + wFormat = (wFormat & (WORD) 3); + + if (ClipboardFormats.Pre2[wFormat]) { + GlobalUnlockFree16(GlobalLock16(ClipboardFormats.Pre2[wFormat], NULL)); + } + + ClipboardFormats.Pre2[wFormat] = hMem16; + } + else if (wFormat == CF_HDROP) { + + if (ClipboardFormats.hmem16Drop) { + GlobalUnlockFree16(GlobalLock16(ClipboardFormats.hmem16Drop, NULL)); + } + ClipboardFormats.hmem16Drop = hMem16; + } + else { + Temp = ClipboardFormats.NewFormats; + if (Temp) { + while ((Temp->Next) && (Temp->Id != wFormat)) { + Temp = Temp->Next; + } + + if (Temp->Id == wFormat) { + + // free a previous handle if it exists + if (Temp->hMem16) { + GlobalUnlockFree16(GlobalLock16(Temp->hMem16, NULL)); + } + + Temp->hMem16 = hMem16; + } + else { + Temp1 = (PCBNODE) malloc_w (sizeof(CBNODE)); + if (Temp1) { + Temp->Next = Temp1; + Temp1->Id = wFormat; + Temp1->hMem16 = hMem16; + Temp1->Next = NULL; + + LOGDEBUG(6,("WOW::WU32ICBStoreHandle: Adding a new node for private clipboard data format %04lx\n", wFormat)); + } + } + } + else { + Temp = (PCBNODE) malloc_w (sizeof(CBNODE)); + if (Temp) { + ClipboardFormats.NewFormats = Temp; + Temp->Id = wFormat; + Temp->hMem16 = hMem16; + Temp->Next = NULL; + + LOGDEBUG(6,("WOW::WU32ICBStoreHandle: Adding the FIRST node for private clipboard data format %04lx\n", wFormat)); + } + } + } +} + + + +HMEM16 WU32ICBGetHandle(WORD wFormat) +{ + HMEM16 hMem16 = 0; + PCBNODE Temp; + + if ((wFormat >= CF_TEXT) && (wFormat <= CF_WAVE)) { + hMem16 = ClipboardFormats.Pre1[wFormat]; + } + else if ((wFormat >= CF_OWNERDISPLAY) && (wFormat <= CF_DSPMETAFILEPICT)) { + wFormat = (wFormat & (WORD) 3); + hMem16 = ClipboardFormats.Pre2[wFormat]; + } + else if (wFormat == CF_HDROP) { + hMem16 = ClipboardFormats.hmem16Drop; + } + else { + Temp = ClipboardFormats.NewFormats; + if (Temp) { + while ((Temp->Next) && (Temp->Id != wFormat)) { + Temp = Temp->Next; + } + + if (Temp->Id == wFormat) { + hMem16 = Temp->hMem16; + } + else { + LOGDEBUG(6,("WOW::WU32ICBGetHandle: Cann't find private clipboard data format %04lx\n", wFormat)); + hMem16 = (WORD) NULL; + } + } + } + + return (hMem16); +} + + + +VOID W32EmptyClipboard () +{ + PCBNODE Temp, Temp1; + int wFormat, cb; + HAND16 hMem16, hMeta16; + LPBYTE lpMem16; + VPVOID vp; + + // Empty CF_METAFILEPICT + + hMem16 = ClipboardFormats.Pre1[CF_METAFILEPICT]; + if (hMem16) { + vp = GlobalLock16(hMem16, &cb); + if (vp) { + GETMISCPTR(vp, lpMem16); + hMeta16 = FETCHWORD(((LPMETAFILEPICT16) lpMem16)->hMF); + GlobalUnlockFree16(GlobalLock16(hMeta16, NULL)); + } + GlobalUnlockFree16(vp); + ClipboardFormats.Pre1[CF_METAFILEPICT] = 0; + } + + // Empty CF_DSPMETAFILEPICT + + hMem16 = ClipboardFormats.Pre2[3]; + if (hMem16) { + vp = GlobalLock16(hMem16, &cb); + if (vp) { + GETMISCPTR(vp, lpMem16); + hMeta16 = FETCHWORD(((LPMETAFILEPICT16) lpMem16)->hMF); + GlobalUnlockFree16(GlobalLock16(hMeta16, NULL)); + } + GlobalUnlockFree16(vp); + ClipboardFormats.Pre2[3] = 0; + } + + // Empty rest of the formats + + for (wFormat=0; wFormat <= CF_WAVE ; wFormat++) { + if (ClipboardFormats.Pre1[wFormat]) { + GlobalUnlockFree16(GlobalLock16(ClipboardFormats.Pre1[wFormat], NULL)); + ClipboardFormats.Pre1[wFormat] = 0; + } + } + + for (wFormat=0; wFormat < 4 ; wFormat++) { + if (ClipboardFormats.Pre2[wFormat]) { + GlobalUnlockFree16(GlobalLock16(ClipboardFormats.Pre2[wFormat], NULL)); + ClipboardFormats.Pre2[wFormat] = 0; + } + } + + if (ClipboardFormats.hmem16Drop) { + GlobalUnlockFree16(GlobalLock16(ClipboardFormats.hmem16Drop, NULL)); + } + ClipboardFormats.hmem16Drop = 0; + + + // These are the private registered data formats. This list is purged when + // 32 bit USER purges its clipboard cache. + + Temp = ClipboardFormats.NewFormats; + ClipboardFormats.NewFormats = NULL; + + while (Temp) { + + Temp1 = Temp->Next; + + if (Temp->hMem16) { + GlobalUnlockFree16(GlobalLock16(Temp->hMem16, NULL)); + } + + free_w(Temp); + + Temp = Temp1; + } + +} + + +VOID InitCBFormats () + +{ + int wFormat; + + for (wFormat = 0 ; wFormat <= CF_WAVE ; wFormat++) { + ClipboardFormats.Pre1[wFormat] = 0; + } + + for (wFormat=0; wFormat < 4; wFormat++) { + ClipboardFormats.Pre2[wFormat] = 0; + } + + ClipboardFormats.hmem16Drop = 0; + + // These are the private registered data formats. + + ClipboardFormats.NewFormats = NULL; + + + CFOLEObjectDescriptor = RegisterClipboardFormat ("Object Descriptor"); + CFOLELinkSrcDescriptor = RegisterClipboardFormat ("Link Source Descriptor"); + +#ifdef DEBUG + + // + // This would assert in LoadLibraryAndGetProcAddresses if the function + // or DLL name has changed. + // + + if (!(OleStringConversion[WOW_OLE_STRINGCONVERSION].lpfn)) { + LoadLibraryAndGetProcAddresses("OLETHK32.DLL", OleStringConversion, WOW_OLESTRINGCONVERSION_COUNT); + } + +#endif + + +} + + +HGLOBAL W32ConvertObjDescriptor(HANDLE hMem, UINT flag) +{ + HANDLE hMemOut; + + if (!(OleStringConversion[WOW_OLE_STRINGCONVERSION].lpfn)) { + if (!LoadLibraryAndGetProcAddresses("OLETHK32.DLL", OleStringConversion, WOW_OLESTRINGCONVERSION_COUNT)) { + return (0); + } + } + + hMemOut = (HANDLE) (*OleStringConversion[WOW_OLE_STRINGCONVERSION].lpfn) (hMem, flag); + + return (hMemOut); +} |