Cancel a few changes to get back basic text clipboard functionality.
This commit is contained in:
parent
4d24e0f5a6
commit
9289a5dff8
|
@ -57,7 +57,7 @@ static HWND hWndViewer = 0; /* start of viewers chain */
|
|||
static WORD LastRegFormat = CF_REGFORMATBASE;
|
||||
|
||||
/* Clipboard cache initial data.
|
||||
* WARNING: This data ordering is dependendent on the WINE_CLIPFORMAT structure
|
||||
* WARNING: This data ordering is dependent on the WINE_CLIPFORMAT structure
|
||||
* declared in clipboard.h
|
||||
*/
|
||||
WINE_CLIPFORMAT ClipFormats[] = {
|
||||
|
@ -390,8 +390,9 @@ static BOOL CLIPBOARD_RenderFormat(LPWINE_CLIPFORMAT lpFormat)
|
|||
{
|
||||
/*
|
||||
* If WINE is not the selection owner, and the format is available
|
||||
* we must ask the the driver to render the data to the clipboard cache.
|
||||
* we must ask the driver to render the data to the clipboard cache.
|
||||
*/
|
||||
TRACE("enter format=%d\n", lpFormat->wFormatID);
|
||||
if ( !USER_Driver.pIsSelectionOwner()
|
||||
&& USER_Driver.pIsClipboardFormatAvailable( lpFormat->wFormatID ) )
|
||||
{
|
||||
|
@ -492,7 +493,8 @@ static INT CLIPBOARD_ConvertText(WORD src_fmt, void const *src, INT src_size,
|
|||
static LPWINE_CLIPFORMAT CLIPBOARD_RenderText( UINT wFormat )
|
||||
{
|
||||
LPWINE_CLIPFORMAT lpSource = ClipFormats;
|
||||
LPWINE_CLIPFORMAT lpTarget;
|
||||
LPWINE_CLIPFORMAT lpTarget = NULL;
|
||||
BOOL foundData = FALSE;
|
||||
|
||||
/* Asked for CF_TEXT but not available - always attempt to convert
|
||||
from CF_UNICODETEXT or CF_OEMTEXT */
|
||||
|
@ -503,7 +505,7 @@ static LPWINE_CLIPFORMAT CLIPBOARD_RenderText( UINT wFormat )
|
|||
/* Convert UNICODETEXT -> TEXT */
|
||||
lpSource = &ClipFormats[CF_UNICODETEXT-1];
|
||||
lpTarget = &ClipFormats[CF_TEXT-1];
|
||||
|
||||
foundData = TRUE;
|
||||
TRACE("\tUNICODETEXT -> TEXT\n");
|
||||
}
|
||||
else if(ClipFormats[CF_OEMTEXT-1].wDataPresent)
|
||||
|
@ -511,11 +513,9 @@ static LPWINE_CLIPFORMAT CLIPBOARD_RenderText( UINT wFormat )
|
|||
/* Convert OEMTEXT -> TEXT */
|
||||
lpSource = &ClipFormats[CF_OEMTEXT-1];
|
||||
lpTarget = &ClipFormats[CF_TEXT-1];
|
||||
|
||||
foundData = TRUE;
|
||||
TRACE("\tOEMTEXT -> TEXT\n");
|
||||
}
|
||||
else
|
||||
lpSource = NULL; /* Conversion format is not available */
|
||||
}
|
||||
/* Asked for CF_OEMTEXT but not available - always attempt to convert
|
||||
from CF_UNICODETEXT or CF_TEXT */
|
||||
|
@ -526,7 +526,7 @@ static LPWINE_CLIPFORMAT CLIPBOARD_RenderText( UINT wFormat )
|
|||
/* Convert UNICODETEXT -> OEMTEXT */
|
||||
lpSource = &ClipFormats[CF_UNICODETEXT-1];
|
||||
lpTarget = &ClipFormats[CF_OEMTEXT-1];
|
||||
|
||||
foundData = TRUE;
|
||||
TRACE("\tUNICODETEXT -> OEMTEXT\n");
|
||||
}
|
||||
else if(ClipFormats[CF_TEXT-1].wDataPresent)
|
||||
|
@ -534,11 +534,9 @@ static LPWINE_CLIPFORMAT CLIPBOARD_RenderText( UINT wFormat )
|
|||
/* Convert TEXT -> OEMTEXT */
|
||||
lpSource = &ClipFormats[CF_TEXT-1];
|
||||
lpTarget = &ClipFormats[CF_OEMTEXT-1];
|
||||
|
||||
foundData = TRUE;
|
||||
TRACE("\tTEXT -> OEMTEXT\n");
|
||||
}
|
||||
else
|
||||
lpSource = NULL; /* Conversion format is not available */
|
||||
}
|
||||
/* Asked for CF_UNICODETEXT but not available - always attempt to convert
|
||||
from CF_TEXT or CF_OEMTEXT */
|
||||
|
@ -549,7 +547,7 @@ static LPWINE_CLIPFORMAT CLIPBOARD_RenderText( UINT wFormat )
|
|||
/* Convert TEXT -> UNICODETEXT */
|
||||
lpSource = &ClipFormats[CF_TEXT-1];
|
||||
lpTarget = &ClipFormats[CF_UNICODETEXT-1];
|
||||
|
||||
foundData = TRUE;
|
||||
TRACE("\tTEXT -> UNICODETEXT\n");
|
||||
}
|
||||
else if(ClipFormats[CF_OEMTEXT-1].wDataPresent)
|
||||
|
@ -557,18 +555,23 @@ static LPWINE_CLIPFORMAT CLIPBOARD_RenderText( UINT wFormat )
|
|||
/* Convert OEMTEXT -> UNICODETEXT */
|
||||
lpSource = &ClipFormats[CF_OEMTEXT-1];
|
||||
lpTarget = &ClipFormats[CF_UNICODETEXT-1];
|
||||
|
||||
foundData = TRUE;
|
||||
TRACE("\tOEMTEXT -> UNICODETEXT\n");
|
||||
}
|
||||
else
|
||||
lpSource = NULL; /* Conversion format is not available */
|
||||
}
|
||||
/* Text format requested is available - no conversion necessary */
|
||||
if (!foundData)
|
||||
{
|
||||
if ((wFormat == CF_TEXT) || (wFormat == CF_OEMTEXT))
|
||||
{
|
||||
lpSource = &ClipFormats[CF_UNICODETEXT-1];
|
||||
lpTarget = __lookup_format( ClipFormats, wFormat );
|
||||
}
|
||||
else
|
||||
{
|
||||
lpSource = __lookup_format( ClipFormats, wFormat );
|
||||
lpTarget = lpSource;
|
||||
}
|
||||
}
|
||||
|
||||
/* First render the source text format */
|
||||
if ( !lpSource || !CLIPBOARD_RenderFormat(lpSource) ) return NULL;
|
||||
|
@ -633,6 +636,62 @@ static LPWINE_CLIPFORMAT CLIPBOARD_RenderText( UINT wFormat )
|
|||
return (lpTarget->hData16 || lpTarget->hData32) ? lpTarget : NULL;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* CLIPBOARD_EnumClipboardFormats (internal)
|
||||
*/
|
||||
static UINT CLIPBOARD_EnumClipboardFormats( UINT wFormat )
|
||||
{
|
||||
LPWINE_CLIPFORMAT lpFormat = ClipFormats;
|
||||
BOOL bFormatPresent;
|
||||
|
||||
if (wFormat == 0) /* start from the beginning */
|
||||
lpFormat = ClipFormats;
|
||||
else
|
||||
{
|
||||
/* walk up to the specified format record */
|
||||
|
||||
if( !(lpFormat = __lookup_format( lpFormat, wFormat )) )
|
||||
return 0;
|
||||
lpFormat = lpFormat->NextFormat; /* right */
|
||||
}
|
||||
|
||||
while(TRUE)
|
||||
{
|
||||
if (lpFormat == NULL) return 0;
|
||||
|
||||
if(CLIPBOARD_IsPresent(lpFormat->wFormatID))
|
||||
break;
|
||||
|
||||
/* Query the driver if not yet in the cache */
|
||||
if (!USER_Driver.pIsSelectionOwner())
|
||||
{
|
||||
if(lpFormat->wFormatID == CF_UNICODETEXT ||
|
||||
lpFormat->wFormatID == CF_TEXT ||
|
||||
lpFormat->wFormatID == CF_OEMTEXT)
|
||||
{
|
||||
if(USER_Driver.pIsClipboardFormatAvailable(CF_UNICODETEXT) ||
|
||||
USER_Driver.pIsClipboardFormatAvailable(CF_TEXT) ||
|
||||
USER_Driver.pIsClipboardFormatAvailable(CF_OEMTEXT))
|
||||
bFormatPresent = TRUE;
|
||||
else
|
||||
bFormatPresent = FALSE;
|
||||
}
|
||||
else
|
||||
bFormatPresent = USER_Driver.pIsClipboardFormatAvailable(lpFormat->wFormatID);
|
||||
|
||||
if(bFormatPresent)
|
||||
break;
|
||||
}
|
||||
|
||||
lpFormat = lpFormat->NextFormat;
|
||||
}
|
||||
|
||||
TRACE("Next available format %d\n", lpFormat->wFormatID);
|
||||
|
||||
return lpFormat->wFormatID;
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* WIN32 Clipboard implementation
|
||||
**************************************************************************/
|
||||
|
@ -1074,7 +1133,6 @@ INT WINAPI CountClipboardFormats(void)
|
|||
return FormatCount;
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* EnumClipboardFormats (USER.144)
|
||||
*/
|
||||
|
@ -1089,9 +1147,6 @@ UINT16 WINAPI EnumClipboardFormats16( UINT16 wFormat )
|
|||
*/
|
||||
UINT WINAPI EnumClipboardFormats( UINT wFormat )
|
||||
{
|
||||
LPWINE_CLIPFORMAT lpFormat = ClipFormats;
|
||||
BOOL bFormatPresent;
|
||||
|
||||
TRACE("(%04X)\n", wFormat);
|
||||
|
||||
if (CLIPBOARD_IsLocked())
|
||||
|
@ -1100,51 +1155,7 @@ UINT WINAPI EnumClipboardFormats( UINT wFormat )
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (wFormat == 0) /* start from the beginning */
|
||||
lpFormat = ClipFormats;
|
||||
else
|
||||
{
|
||||
/* walk up to the specified format record */
|
||||
|
||||
if( !(lpFormat = __lookup_format( lpFormat, wFormat )) )
|
||||
return 0;
|
||||
lpFormat = lpFormat->NextFormat; /* right */
|
||||
}
|
||||
|
||||
while(TRUE)
|
||||
{
|
||||
if (lpFormat == NULL) return 0;
|
||||
|
||||
if(CLIPBOARD_IsPresent(lpFormat->wFormatID))
|
||||
break;
|
||||
|
||||
/* Query the driver if not yet in the cache */
|
||||
if (!USER_Driver.pIsSelectionOwner())
|
||||
{
|
||||
if(lpFormat->wFormatID == CF_UNICODETEXT ||
|
||||
lpFormat->wFormatID == CF_TEXT ||
|
||||
lpFormat->wFormatID == CF_OEMTEXT)
|
||||
{
|
||||
if(USER_Driver.pIsClipboardFormatAvailable(CF_UNICODETEXT) ||
|
||||
USER_Driver.pIsClipboardFormatAvailable(CF_TEXT) ||
|
||||
USER_Driver.pIsClipboardFormatAvailable(CF_OEMTEXT))
|
||||
bFormatPresent = TRUE;
|
||||
else
|
||||
bFormatPresent = FALSE;
|
||||
}
|
||||
else
|
||||
bFormatPresent = USER_Driver.pIsClipboardFormatAvailable(lpFormat->wFormatID);
|
||||
|
||||
if(bFormatPresent)
|
||||
break;
|
||||
}
|
||||
|
||||
lpFormat = lpFormat->NextFormat;
|
||||
}
|
||||
|
||||
TRACE("Next available format %d\n", lpFormat->wFormatID);
|
||||
|
||||
return lpFormat->wFormatID;
|
||||
return CLIPBOARD_EnumClipboardFormats(wFormat);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1368,8 +1379,13 @@ BOOL WINAPI IsClipboardFormatAvailable( UINT wFormat )
|
|||
if (wFormat == 0) /* Reject this case quickly */
|
||||
bRet = FALSE;
|
||||
else
|
||||
bRet = EnumClipboardFormats(wFormat - 1) == wFormat;
|
||||
|
||||
{
|
||||
UINT iret = CLIPBOARD_EnumClipboardFormats(wFormat - 1);
|
||||
if ((wFormat == CF_TEXT) || (wFormat == CF_OEMTEXT) || (wFormat == CF_UNICODETEXT))
|
||||
bRet = ((iret == CF_TEXT) || (iret == CF_OEMTEXT) || (iret == CF_UNICODETEXT));
|
||||
else
|
||||
bRet = iret == wFormat;
|
||||
}
|
||||
TRACE("(%04X)- ret(%d)\n", wFormat, bRet);
|
||||
return bRet;
|
||||
}
|
||||
|
|
|
@ -192,7 +192,7 @@ Atom X11DRV_CLIPBOARD_MapFormatToProperty(UINT wFormat)
|
|||
/**************************************************************************
|
||||
* X11DRV_CLIPBOARD_IsNativeProperty
|
||||
*
|
||||
* Checks if a property is a native property type
|
||||
* Checks if a property is a native Wine property type
|
||||
*/
|
||||
BOOL X11DRV_CLIPBOARD_IsNativeProperty(Atom prop)
|
||||
{
|
||||
|
@ -332,6 +332,7 @@ int X11DRV_CLIPBOARD_CacheDataFormats( Atom SelectionName )
|
|||
Window w;
|
||||
Window ownerSelection = 0;
|
||||
|
||||
TRACE("enter\n");
|
||||
/*
|
||||
* Empty the clipboard cache
|
||||
*/
|
||||
|
@ -379,7 +380,7 @@ int X11DRV_CLIPBOARD_CacheDataFormats( Atom SelectionName )
|
|||
if ( (xe.xselection.target != aTargets)
|
||||
|| (xe.xselection.property == None) )
|
||||
{
|
||||
TRACE("\tCould not retrieve TARGETS\n");
|
||||
TRACE("\tExit, could not retrieve TARGETS\n");
|
||||
return cSelectionTargets;
|
||||
}
|
||||
|
||||
|
@ -890,7 +891,7 @@ BOOL X11DRV_IsClipboardFormatAvailable(UINT wFormat)
|
|||
Window ownerPrimary = TSXGetSelectionOwner(display,XA_PRIMARY);
|
||||
Window ownerClipboard = TSXGetSelectionOwner(display,xaClipboard);
|
||||
|
||||
TRACE("%d\n", wFormat);
|
||||
TRACE("enter for %d\n", wFormat);
|
||||
|
||||
/*
|
||||
* If the selection has not been previously cached, or the selection has changed,
|
||||
|
@ -915,10 +916,14 @@ BOOL X11DRV_IsClipboardFormatAvailable(UINT wFormat)
|
|||
/* Exit if there is no selection */
|
||||
if ( !ownerClipboard && !ownerPrimary )
|
||||
{
|
||||
TRACE("There is no selection\n");
|
||||
TRACE("There is no selection owner\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Check if the format is available in the clipboard cache */
|
||||
if ( CLIPBOARD_IsPresent(wFormat) )
|
||||
return TRUE;
|
||||
|
||||
/*
|
||||
* Many X client apps (such as XTerminal) don't support being queried
|
||||
* for the "TARGETS" target atom. To handle such clients we must actually
|
||||
|
|
Loading…
Reference in New Issue