Add CF_UNICODETEXT as primary text clipboard format.
Use [x11drv].TextCP for interchange with X.

diff --git a/include/clipboard.h b/include/clipboard.h
index 99b2a8f..dca0f14 100644
--- a/include/clipboard.h
+++ b/include/clipboard.h
@@ -7,9 +7,9 @@
 struct tagWND;
 
 typedef struct tagWINE_CLIPFORMAT {
-    WORD	wFormatID;
-    WORD	wRefCount;
-    WORD	wDataPresent;
+    UINT	wFormatID;
+    UINT	wRefCount;
+    BOOL	wDataPresent;
     LPSTR	Name;
     HANDLE16    hData16;
     HANDLE	hDataSrc32;
diff --git a/windows/clipboard.c b/windows/clipboard.c
index 3c3ddd8..2da3a59 100644
--- a/windows/clipboard.c
+++ b/windows/clipboard.c
@@ -58,7 +58,7 @@
  * WARNING: This data ordering is dependendent on the WINE_CLIPFORMAT structure
  * declared in clipboard.h
  */
-WINE_CLIPFORMAT ClipFormats[17]  = {
+WINE_CLIPFORMAT ClipFormats[]  = {
     { CF_TEXT, 1, 0, "Text",  0, 0, 0, 0, NULL, &ClipFormats[1]},
     { CF_BITMAP, 1, 0, "Bitmap", 0, 0, 0, 0, &ClipFormats[0], &ClipFormats[2]},
     { CF_METAFILEPICT, 1, 0, "MetaFile Picture", 0, 0, 0, 0, &ClipFormats[1], &ClipFormats[3]},
@@ -71,11 +71,12 @@
     { CF_PENDATA, 1, 0, "PenData", 0, 0, 0, 0, &ClipFormats[8], &ClipFormats[10]},
     { CF_RIFF, 1, 0, "RIFF", 0, 0, 0, 0, &ClipFormats[9], &ClipFormats[11]},
     { CF_WAVE, 1, 0, "Wave", 0, 0, 0, 0, &ClipFormats[10], &ClipFormats[12]},
-    { CF_OWNERDISPLAY, 1, 0, "Owner Display", 0, 0, 0, 0, &ClipFormats[11], &ClipFormats[13]},
-    { CF_DSPTEXT, 1, 0, "DSPText", 0, 0, 0, 0, &ClipFormats[12], &ClipFormats[14]},
-    { CF_DSPMETAFILEPICT, 1, 0, "DSPMetaFile Picture", 0, 0, 0, 0, &ClipFormats[13], &ClipFormats[15]},
-    { CF_DSPBITMAP, 1, 0, "DSPBitmap", 0, 0, 0, 0, &ClipFormats[14], &ClipFormats[16]},
-    { CF_HDROP, 1, 0, "HDROP", 0, 0, 0, 0, &ClipFormats[15], NULL}
+    { CF_UNICODETEXT, 1, 0, "Unicode Text", 0, 0, 0, 0, &ClipFormats[11], &ClipFormats[13]},
+    { CF_OWNERDISPLAY, 1, 0, "Owner Display", 0, 0, 0, 0, &ClipFormats[12], &ClipFormats[14]},
+    { CF_DSPTEXT, 1, 0, "DSPText", 0, 0, 0, 0, &ClipFormats[13], &ClipFormats[15]},
+    { CF_DSPMETAFILEPICT, 1, 0, "DSPMetaFile Picture", 0, 0, 0, 0, &ClipFormats[14], &ClipFormats[16]},
+    { CF_DSPBITMAP, 1, 0, "DSPBitmap", 0, 0, 0, 0, &ClipFormats[15], &ClipFormats[17]},
+    { CF_HDROP, 1, 0, "HDROP", 0, 0, 0, 0, &ClipFormats[16], NULL}
 };
 
 
@@ -276,9 +277,10 @@
 {
     /* special case */
 
-    if( wFormat == CF_TEXT || wFormat == CF_OEMTEXT )
+    if( wFormat == CF_TEXT || wFormat == CF_OEMTEXT || wFormat == CF_UNICODETEXT )
         return ClipFormats[CF_TEXT-1].wDataPresent ||
-               ClipFormats[CF_OEMTEXT-1].wDataPresent;
+	       ClipFormats[CF_OEMTEXT-1].wDataPresent ||
+	       ClipFormats[CF_UNICODETEXT-1].wDataPresent;
     else
     {
 	LPWINE_CLIPFORMAT lpFormat = __lookup_format( ClipFormats, wFormat );
@@ -422,6 +424,58 @@
   return (lpFormat->hData16 || lpFormat->hData32) ? TRUE : FALSE;
 }
 
+/**************************************************************************
+ *                      CLIPBOARD_ConvertText
+ * Returns number of required/converted characters - not bytes!
+ */
+static INT CLIPBOARD_ConvertText(WORD src_fmt, void const *src, INT src_size,
+				 WORD dst_fmt, void *dst, INT dst_size)
+{
+    UINT cp;
+
+    if(src_fmt == CF_UNICODETEXT)
+    {
+	switch(dst_fmt)
+	{
+	case CF_TEXT:
+	    cp = CP_ACP;
+	    break;
+	case CF_OEMTEXT:
+	    cp = CP_OEMCP;
+	    break;
+	default:
+	    return 0;
+	}
+	return WideCharToMultiByte(cp, 0, src, src_size, dst, dst_size, NULL, NULL);
+    }
+
+    if(dst_fmt == CF_UNICODETEXT)
+    {
+	switch(src_fmt)
+	{
+	case CF_TEXT:
+	    cp = CP_ACP;
+	    break;
+	case CF_OEMTEXT:
+	    cp = CP_OEMCP;
+	    break;
+	default:
+	    return 0;
+	}
+	return MultiByteToWideChar(cp, 0, src, src_size, dst, dst_size);
+    }
+
+    if(!dst_size) return src_size;
+
+    if(dst_size > src_size) dst_size = src_size;
+
+    if(src_fmt == CF_TEXT )
+	CharToOemBuffA(src, dst, dst_size);
+    else
+	OemToCharBuffA(src, dst, dst_size);
+
+    return dst_size;
+}
 
 /**************************************************************************
  *                      CLIPBOARD_RenderText
@@ -438,24 +492,74 @@
     LPWINE_CLIPFORMAT lpSource = ClipFormats; 
     LPWINE_CLIPFORMAT lpTarget;
     
-    /* Asked for CF_TEXT and not available - always attempt to convert from CF_OEM_TEXT */
+    /* Asked for CF_TEXT but not available - always attempt to convert
+       from CF_UNICODETEXT or CF_OEMTEXT */
     if( wFormat == CF_TEXT && !ClipFormats[CF_TEXT-1].wDataPresent )
     {
-        /* Convert OEMTEXT -> TEXT */
-        lpSource = &ClipFormats[CF_OEMTEXT-1];
-        lpTarget = &ClipFormats[CF_TEXT-1];
+	if(ClipFormats[CF_UNICODETEXT-1].wDataPresent)
+	{
+	    /* Convert UNICODETEXT -> TEXT */
+	    lpSource = &ClipFormats[CF_UNICODETEXT-1];
+	    lpTarget = &ClipFormats[CF_TEXT-1];
 
-        TRACE("\tOEMTEXT -> TEXT\n");
+	    TRACE("\tUNICODETEXT -> TEXT\n");
+	}
+	else if(ClipFormats[CF_OEMTEXT-1].wDataPresent)
+	{
+	    /* Convert OEMTEXT -> TEXT */
+	    lpSource = &ClipFormats[CF_OEMTEXT-1];
+	    lpTarget = &ClipFormats[CF_TEXT-1];
+
+	    TRACE("\tOEMTEXT -> TEXT\n");
+	}
+	else
+	    lpSource = NULL; /* Conversion format is not available */
     }
-    /* Asked for CF_OEM_TEXT, and CF_TEXT available */
-    else if( wFormat == CF_OEMTEXT && !ClipFormats[CF_OEMTEXT-1].wDataPresent
-				   &&  ClipFormats[CF_TEXT-1].wDataPresent )
+    /* Asked for CF_OEMTEXT but not available - always attempt to convert
+       from CF_UNICODETEXT or CF_TEXT */
+    else if( wFormat == CF_OEMTEXT && !ClipFormats[CF_OEMTEXT-1].wDataPresent )
     {
-	/* Convert TEXT -> OEMTEXT */
-        lpSource = &ClipFormats[CF_TEXT-1];
-	lpTarget = &ClipFormats[CF_OEMTEXT-1];
-	
-	TRACE("\tTEXT -> OEMTEXT\n");
+	if(ClipFormats[CF_UNICODETEXT-1].wDataPresent)
+	{
+	    /* Convert UNICODETEXT -> OEMTEXT */
+	    lpSource = &ClipFormats[CF_UNICODETEXT-1];
+	    lpTarget = &ClipFormats[CF_OEMTEXT-1];
+
+	    TRACE("\tUNICODETEXT -> OEMTEXT\n");
+	}
+	else if(ClipFormats[CF_TEXT-1].wDataPresent)
+	{
+	    /* Convert TEXT -> OEMTEXT */
+	    lpSource = &ClipFormats[CF_TEXT-1];
+	    lpTarget = &ClipFormats[CF_OEMTEXT-1];
+
+	    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 */
+    else if( wFormat == CF_UNICODETEXT && !ClipFormats[CF_UNICODETEXT-1].wDataPresent )
+    {
+	if(ClipFormats[CF_TEXT-1].wDataPresent)
+	{
+	    /* Convert TEXT -> UNICODETEXT */
+	    lpSource = &ClipFormats[CF_TEXT-1];
+	    lpTarget = &ClipFormats[CF_UNICODETEXT-1];
+
+	    TRACE("\tTEXT -> UNICODETEXT\n");
+	}
+	else if(ClipFormats[CF_OEMTEXT-1].wDataPresent)
+	{
+	    /* Convert OEMTEXT -> UNICODETEXT */
+	    lpSource = &ClipFormats[CF_OEMTEXT-1];
+	    lpTarget = &ClipFormats[CF_UNICODETEXT-1];
+
+	    TRACE("\tOEMTEXT -> UNICODETEXT\n");
+	}
+	else
+	    lpSource = NULL; /* Conversion format is not available */
     }
     /* Text format requested is available - no conversion necessary */
     else
@@ -470,35 +574,48 @@
     /* Convert to the desired target text format, if necessary */
     if( lpTarget != lpSource && !lpTarget->hData16 && !lpTarget->hData32 )
     {
-        UINT16 size;
+        INT src_chars, dst_chars, alloc_size;
         LPCSTR lpstrS; 
         LPSTR  lpstrT;
     
         if (lpSource->hData32)
         {
-          size = GlobalSize( lpSource->hData32 );
           lpstrS = (LPSTR)GlobalLock(lpSource->hData32);
         }
         else
         {
-          size = GlobalSize16( lpSource->hData16 );
           lpstrS = (LPSTR)GlobalLock16(lpSource->hData16);
         }
     
         if( !lpstrS ) return NULL;
+
+	/* Text always NULL terminated */
+	if(lpSource->wFormatID == CF_UNICODETEXT)
+	    src_chars = strlenW((LPCWSTR)lpstrS);
+	else
+	    src_chars = strlen(lpstrS);
+
+	/* Calculate number of characters in the destination buffer */
+	dst_chars = CLIPBOARD_ConvertText(lpSource->wFormatID, lpstrS, src_chars,
+				     lpTarget->wFormatID, NULL, 0);
+	if(!dst_chars) return NULL;
+
         TRACE("\tconverting from '%s' to '%s', %i chars\n",
-                                          lpSource->Name, lpTarget->Name, size);
-    
-        lpTarget->hData32 = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, size);
+		lpSource->Name, lpTarget->Name, src_chars);
+
+	/* Convert characters to bytes */
+	if(lpTarget->wFormatID == CF_UNICODETEXT)
+	    alloc_size = dst_chars * sizeof(WCHAR);
+	else
+	    alloc_size = dst_chars;
+
+        lpTarget->hData32 = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, alloc_size);
         lpstrT = (LPSTR)GlobalLock(lpTarget->hData32);
-    
+
         if( lpstrT )
         {
-            if( lpSource->wFormatID == CF_TEXT )
-                CharToOemBuffA(lpstrS, lpstrT, size);
-            else
-                OemToCharBuffA(lpstrS, lpstrT, size);
-            TRACE("\tgot %s\n", lpstrT);
+	    CLIPBOARD_ConvertText(lpSource->wFormatID, lpstrS, src_chars,
+				  lpTarget->wFormatID, lpstrT, dst_chars);
             GlobalUnlock(lpTarget->hData32);
         }
         else
@@ -678,18 +795,22 @@
     {
 	CLIPBOARD_DeleteRecord(lpFormat, TRUE);
 
-	/* delete existing CF_TEXT/CF_OEMTEXT aliases */
-
-	if( wFormat == CF_TEXT 
-	    && ( ClipFormats[CF_OEMTEXT-1].hData16 
-		 ||  ClipFormats[CF_OEMTEXT-1].hData32 )
-	    && !ClipFormats[CF_OEMTEXT-1].wDataPresent )
-	    CLIPBOARD_DeleteRecord(&ClipFormats[CF_OEMTEXT-1], TRUE);
-        if( wFormat == CF_OEMTEXT 
-	    && ( ClipFormats[CF_OEMTEXT-1].hData16 
-		 ||  ClipFormats[CF_OEMTEXT-1].hData32 )
-	    && !ClipFormats[CF_TEXT-1].wDataPresent )
+	/* delete existing CF_UNICODETEXT/CF_TEXT/CF_OEMTEXT aliases */
+	if(wFormat == CF_UNICODETEXT)
+	{
 	    CLIPBOARD_DeleteRecord(&ClipFormats[CF_TEXT-1], TRUE);
+	    CLIPBOARD_DeleteRecord(&ClipFormats[CF_OEMTEXT-1], TRUE);
+	}
+	else if(wFormat == CF_TEXT)
+	{
+	    CLIPBOARD_DeleteRecord(&ClipFormats[CF_UNICODETEXT-1], TRUE);
+	    CLIPBOARD_DeleteRecord(&ClipFormats[CF_OEMTEXT-1], TRUE);
+	}
+	else if(wFormat == CF_OEMTEXT)
+	{
+	    CLIPBOARD_DeleteRecord(&ClipFormats[CF_UNICODETEXT-1], TRUE);
+	    CLIPBOARD_DeleteRecord(&ClipFormats[CF_TEXT-1], TRUE);
+	}
     }
 
     bCBHasChanged = TRUE;
@@ -732,18 +853,22 @@
     {
 	CLIPBOARD_DeleteRecord(lpFormat, TRUE);
 
-	/* delete existing CF_TEXT/CF_OEMTEXT aliases */
-
-	if( wFormat == CF_TEXT 
-	    && ( ClipFormats[CF_OEMTEXT-1].hData16 
-		 ||  ClipFormats[CF_OEMTEXT-1].hData32 )
-	    && !ClipFormats[CF_OEMTEXT-1].wDataPresent )
-	    CLIPBOARD_DeleteRecord(&ClipFormats[CF_OEMTEXT-1], TRUE);
-        if( wFormat == CF_OEMTEXT 
-	    && ( ClipFormats[CF_OEMTEXT-1].hData16 
-		 ||  ClipFormats[CF_OEMTEXT-1].hData32 )
-	    && !ClipFormats[CF_TEXT-1].wDataPresent )
+	/* delete existing CF_UNICODETEXT/CF_TEXT/CF_OEMTEXT aliases */
+	if(wFormat == CF_UNICODETEXT)
+	{
 	    CLIPBOARD_DeleteRecord(&ClipFormats[CF_TEXT-1], TRUE);
+	    CLIPBOARD_DeleteRecord(&ClipFormats[CF_OEMTEXT-1], TRUE);
+	}
+	else if(wFormat == CF_TEXT)
+	{
+	    CLIPBOARD_DeleteRecord(&ClipFormats[CF_UNICODETEXT-1], TRUE);
+	    CLIPBOARD_DeleteRecord(&ClipFormats[CF_OEMTEXT-1], TRUE);
+	}
+	else if(wFormat == CF_OEMTEXT)
+	{
+	    CLIPBOARD_DeleteRecord(&ClipFormats[CF_UNICODETEXT-1], TRUE);
+	    CLIPBOARD_DeleteRecord(&ClipFormats[CF_TEXT-1], TRUE);
+	}
     }
 
     bCBHasChanged = TRUE;
@@ -780,7 +905,7 @@
         return 0;
     }
 
-    if( wFormat == CF_TEXT || wFormat == CF_OEMTEXT )
+    if( wFormat == CF_UNICODETEXT || wFormat == CF_TEXT || wFormat == CF_OEMTEXT )
     {
 	lpRender = CLIPBOARD_RenderText(wFormat);
         if ( !lpRender ) return 0;
@@ -847,7 +972,7 @@
         return 0;
     }
 
-    if( wFormat == CF_TEXT || wFormat == CF_OEMTEXT )
+    if( wFormat == CF_UNICODETEXT || wFormat == CF_TEXT || wFormat == CF_OEMTEXT )
     {
 	lpRender = CLIPBOARD_RenderText(wFormat);
         if ( !lpRender ) return 0;
@@ -938,10 +1063,10 @@
 	lpFormat = lpFormat->NextFormat;
     }
 
-    /* these two are equivalent, adjust the total */
-
-    FormatCount += abs(ClipFormats[CF_TEXT-1].wDataPresent -
-                       ClipFormats[CF_OEMTEXT-1].wDataPresent);
+    /* these are equivalent, adjust the total */
+    FormatCount += (ClipFormats[CF_UNICODETEXT-1].wDataPresent ||
+		    ClipFormats[CF_TEXT-1].wDataPresent ||
+		    ClipFormats[CF_OEMTEXT-1].wDataPresent) ? 1 : 0;
 
     TRACE("\ttotal %d\n", FormatCount);
     return FormatCount;
@@ -988,25 +1113,35 @@
     {
 	if (lpFormat == NULL) return 0;
 
-        /* Synthesize CF_TEXT from CF_OEMTEXT and vice versa */
-	bFormatPresent = (lpFormat->wDataPresent ||
-           (lpFormat->wFormatID == CF_OEMTEXT && ClipFormats[CF_TEXT-1].wDataPresent) ||
-	   (lpFormat->wFormatID == CF_TEXT && ClipFormats[CF_OEMTEXT-1].wDataPresent) );
+	if(CLIPBOARD_IsPresent(lpFormat->wFormatID))
+	    break;
 
         /* Query the driver if not yet in the cache */
-        if (!bFormatPresent && !USER_Driver.pIsSelectionOwner())
+        if (!USER_Driver.pIsSelectionOwner())
         {
-            bFormatPresent =
-               USER_Driver.pIsClipboardFormatAvailable( (lpFormat->wFormatID == CF_TEXT) ?
-                                                      CF_OEMTEXT : lpFormat->wFormatID );
-        }
+	    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;
+	    if(bFormatPresent)
+		break;
+        }
 
 	lpFormat = lpFormat->NextFormat;
     }
 
+    TRACE("Next available format %d\n", lpFormat->wFormatID);
+
     return lpFormat->wFormatID;
 }
 
@@ -1230,14 +1365,8 @@
 
     if (wFormat == 0)  /* Reject this case quickly */
         bRet = FALSE;
-
-    /* If WINE is not the clipboard selection owner ask the clipboard driver */
-    else if ( !USER_Driver.pIsSelectionOwner() )
-        bRet = USER_Driver.pIsClipboardFormatAvailable( (wFormat == CF_TEXT) ?
-                                                     CF_OEMTEXT : wFormat );
-    /* Check if the format is in the local cache */
-    else 
-        bRet = CLIPBOARD_IsPresent(wFormat);
+    else
+	bRet = EnumClipboardFormats(wFormat - 1) == wFormat;
 
     TRACE("(%04X)- ret(%d)\n", wFormat, bRet);
     return bRet;
diff --git a/windows/queue.c b/windows/queue.c
index 9f90f58..4e9ca17 100644
--- a/windows/queue.c
+++ b/windows/queue.c
@@ -14,7 +14,6 @@
 #include "queue.h"
 #include "task.h"
 #include "win.h"
-#include "clipboard.h"
 #include "hook.h"
 #include "heap.h"
 #include "thread.h"
diff --git a/windows/user.c b/windows/user.c
index 137d65f..4229299 100644
--- a/windows/user.c
+++ b/windows/user.c
@@ -15,7 +15,6 @@
 #include "task.h"
 #include "queue.h"
 #include "win.h"
-#include "clipboard.h"
 #include "controls.h"
 #include "cursoricon.h"
 #include "hook.h"
diff --git a/windows/x11drv/clipboard.c b/windows/x11drv/clipboard.c
index 8434793..2ce203f 100644
--- a/windows/x11drv/clipboard.c
+++ b/windows/x11drv/clipboard.c
@@ -107,7 +107,7 @@
     else if ( 0 == strncmp(itemFmtName, FMT_PREFIX, strlen(FMT_PREFIX)) )
         return RegisterClipboardFormatA(itemFmtName + strlen(FMT_PREFIX));
     else if ( 0 == strcmp(itemFmtName, "STRING") )
-        return CF_OEMTEXT;
+        return CF_UNICODETEXT;
     else if ( 0 == strcmp(itemFmtName, "PIXMAP")
                 ||  0 == strcmp(itemFmtName, "BITMAP") )
     {
@@ -139,8 +139,12 @@
     
     switch (wFormat)
     {
+	/* We support only CF_UNICODETEXT, other formats are synthesized */
         case CF_OEMTEXT:
         case CF_TEXT:
+	    return None;
+
+        case CF_UNICODETEXT:
             prop = XA_STRING;
             break;
 
@@ -516,9 +520,9 @@
      * format, if possible.
      */
     if ( (reqType == XA_STRING)
-         && (atype == XA_STRING) && (aformat == 8) ) /* treat Unix text as CF_OEMTEXT */
+         && (atype == XA_STRING) && (aformat == 8) )
+    /* convert Unix text to CF_UNICODETEXT */
     {
-      HANDLE16   hText = 0;
       int 	   i,inlcount = 0;
       char*      lpstr;
  
@@ -527,37 +531,32 @@
       for(i=0; i <= nitems; i++)
           if( val[i] == '\n' ) inlcount++;
  
-        hText=GlobalAlloc16(GMEM_MOVEABLE, nitems + inlcount + 1);
-        if( (lpstr = (char*)GlobalLock16(hText)) )
-        {
-		  ZeroMemory(lpstr, nitems + inlcount + 1);
+      if( (lpstr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nitems + inlcount + 1)) )
+      {
+	  static UINT text_cp = (UINT)-1;
+	  UINT count;
+	  HANDLE hUnicodeText;
+
           for(i=0,inlcount=0; i <= nitems; i++)
           {
              if( val[i] == '\n' ) lpstr[inlcount++]='\r';
              lpstr[inlcount++]=val[i];
           }
-          GlobalUnlock16(hText);
-        }
-        else
-            hText = 0;
-      
-      if( hText )
-      {
-          /* delete previous CF_TEXT and CF_OEMTEXT data */
-          lpFormat = CLIPBOARD_LookupFormat(CF_TEXT);
-          if (lpFormat->wDataPresent || lpFormat->hData16 || lpFormat->hData32) 
-              CLIPBOARD_DeleteRecord(lpFormat, !(hWndClipWindow));
-          
-          lpFormat = CLIPBOARD_LookupFormat(CF_OEMTEXT);
-          if (lpFormat->wDataPresent || lpFormat->hData16 || lpFormat->hData32)  
-              CLIPBOARD_DeleteRecord(lpFormat, !(hWndClipWindow));
- 
-          /* Update the CF_OEMTEXT record */
-          lpFormat->wDataPresent = 1;
-          lpFormat->hData32 = 0;
-          lpFormat->hData16 = hText;
- 
-          bRet = TRUE;
+
+	  if(text_cp == (UINT)-1)
+	      text_cp = PROFILE_GetWineIniInt("x11drv", "TextCP", CP_ACP);
+
+	  count = MultiByteToWideChar(text_cp, 0, lpstr, -1, NULL, 0);
+	  hUnicodeText = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, count * sizeof(WCHAR));
+	  if(hUnicodeText)
+	  {
+	      WCHAR *textW = GlobalLock(hUnicodeText);
+	      MultiByteToWideChar(text_cp, 0, lpstr, -1, textW, count);
+	      GlobalUnlock(hUnicodeText);
+	      SetClipboardData(CF_UNICODETEXT, hUnicodeText);
+	      bRet = TRUE;
+	  }
+	  HeapFree(GetProcessHeap(), 0, lpstr);
       }
     }
     else if ( reqType == XA_PIXMAP || reqType == XA_BITMAP ) /* treat PIXMAP as CF_DIB or CF_BITMAP */
@@ -594,7 +593,7 @@
           WARN("PIXMAP conversion failed!\n" );
           goto END;
       }
-      
+
       /* Delete previous clipboard data */
       lpFormat = CLIPBOARD_LookupFormat(wFormat);
       if (lpFormat->wDataPresent && (lpFormat->hData16 || lpFormat->hData32))
@@ -891,6 +890,8 @@
     Window ownerPrimary = TSXGetSelectionOwner(display,XA_PRIMARY);
     Window ownerClipboard = TSXGetSelectionOwner(display,xaClipboard);
 
+    TRACE("%d\n", wFormat);
+
     /*
      * If the selection has not been previously cached, or the selection has changed,
      * try and cache the list of available selection targets from the current selection.
@@ -913,14 +914,10 @@
 
     /* Exit if there is no selection */
     if ( !ownerClipboard && !ownerPrimary )
+    {
+	TRACE("There is no selection\n");
         return FALSE;
-
-    if ( wFormat == CF_TEXT )
-        wFormat = CF_OEMTEXT;
-    
-    /* 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
@@ -930,6 +927,7 @@
     if ( !cSelectionTargets )
         return X11DRV_GetClipboardData( wFormat );
         
+    TRACE("There is no selection\n");
     return FALSE;
 }
 
@@ -987,8 +985,7 @@
  *
  * This method is invoked only when we DO NOT own the X selection
  *
- * NOTE: Clipboard driver doesn't get requests for CF_TEXT data, only
- * for CF_OEMTEXT.
+ * NOTE: Clipboard driver get requests only for CF_UNICODETEXT data.
  * We always get the data from the selection client each time,
  * since we have no way of determining if the data in our cache is stale.
  */
@@ -1000,6 +997,8 @@
     WND* wnd = NULL;
     LPWINE_CLIPFORMAT lpFormat;
 
+    TRACE("%d\n", wFormat);
+
     if( !selectionAcquired && (wnd = WIN_FindWndPtr(hWnd)) )
     {
 	XEvent xe;
@@ -1054,6 +1053,8 @@
 
         TRACE("\tpresent %s = %i\n", CLIPBOARD_GetFormatName(wFormat), bRet );
     }
+
+    TRACE("Returning %d\n", bRet);
     
     return bRet;
 }
diff --git a/windows/x11drv/event.c b/windows/x11drv/event.c
index 519ab37..99364a6 100644
--- a/windows/x11drv/event.c
+++ b/windows/x11drv/event.c
@@ -1071,29 +1071,40 @@
  */
 static Atom EVENT_SelectionRequest_STRING( Window requestor, Atom target, Atom rprop )
 {
-    HANDLE16 hText;
+    static UINT text_cp = (UINT)-1;
+    HANDLE hUnicodeText;
+    LPWSTR uni_text;
     LPSTR  text;
     int    size,i,j;
     char* lpstr = 0;
     char *itemFmtName;
     int xRc;
 
+    if(text_cp == (UINT)-1)
+	text_cp = PROFILE_GetWineIniInt("x11drv", "TextCP", CP_ACP);
+
     /*
      * Map the requested X selection property type atom name to a
      * windows clipboard format ID.
      */
     itemFmtName = TSXGetAtomName(display, target);
     TRACE("Request for %s (wFormat=%x %s)\n",
-                  itemFmtName, CF_TEXT, CLIPBOARD_GetFormatName(CF_TEXT));
+	itemFmtName, CF_UNICODETEXT, CLIPBOARD_GetFormatName(CF_UNICODETEXT));
     TSXFree(itemFmtName);
 
-    hText = GetClipboardData16(CF_TEXT);
-    if ( !hText )
+    hUnicodeText = GetClipboardData(CF_UNICODETEXT);
+    if(!hUnicodeText)
        return None;
-    text = GlobalLock16(hText);
+    uni_text = GlobalLock(hUnicodeText);
+    if(!uni_text)
+       return None;
+
+    size = WideCharToMultiByte(text_cp, 0, uni_text, -1, NULL, 0, NULL, NULL);
+    text = HeapAlloc(GetProcessHeap(), 0, size);
     if (!text)
        return None;
-    size = GlobalSize16(hText);
+    WideCharToMultiByte(text_cp, 0, uni_text, -1, text, size, NULL, NULL);
+
     /* remove carriage returns */
     
     lpstr = (char*)HeapAlloc( GetProcessHeap(), 0, size-- );
@@ -1113,7 +1124,8 @@
                             lpstr, j);
     TRACE("(Rc=%d)\n", xRc);
 
-    GlobalUnlock16(hText);
+    GlobalUnlock(hUnicodeText);
+    HeapFree(GetProcessHeap(), 0, text);
     HeapFree( GetProcessHeap(), 0, lpstr );
 
     return rprop;