Convert WND.text field to Unicode.
Add new key to wine.ini in the section [x11drv] - TextCP, which means
code page used for texts passed to X.
Accordingly fix handlers of WM_SETTEXT/WM_GETTEXT.

diff --git a/windows/mdi.c b/windows/mdi.c
index 3d5cabf..ed19649 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -93,7 +93,7 @@
 static HBITMAP16 hBmpRestore = 0;
 
 /* ----------------- declarations ----------------- */
-static void MDI_UpdateFrameText(WND *, HWND, BOOL, LPCSTR);
+static void MDI_UpdateFrameText(WND *, HWND, BOOL, LPCWSTR);
 static BOOL MDI_AugmentFrameMenu(MDICLIENTINFO*, WND *, HWND);
 static BOOL MDI_RestoreFrameMenu(WND *, HWND);
 
@@ -128,11 +128,12 @@
  */
 static BOOL MDI_MenuModifyItem(WND* clientWnd, HWND hWndChild )
 {
-    char            buffer[128];
+    WCHAR           buffer[128];
+    static const WCHAR format[] = {'%','d',' ',0};
     MDICLIENTINFO  *clientInfo = (MDICLIENTINFO*)clientWnd->wExtra;
     WND            *wndPtr     = WIN_FindWndPtr(hWndChild);
-    UINT	    n          = sprintf(buffer, "%d ",
-				 wndPtr->wIDmenu - clientInfo->idFirstChild + 1);
+    UINT	    n          = wsprintfW(buffer, format,
+                                           wndPtr->wIDmenu - clientInfo->idFirstChild + 1);
     BOOL	    bRet	    = 0;
 
     if( !clientInfo->hWindowMenu )
@@ -141,10 +142,10 @@
         goto END;
     }
 
-    if (wndPtr->text) lstrcpynA(buffer + n, wndPtr->text, sizeof(buffer) - n );
+    if (wndPtr->text) lstrcpynW(buffer + n, wndPtr->text, sizeof(buffer)/sizeof(WCHAR) - n );
 
     n    = GetMenuState(clientInfo->hWindowMenu,wndPtr->wIDmenu ,MF_BYCOMMAND); 
-    bRet = ModifyMenuA(clientInfo->hWindowMenu , wndPtr->wIDmenu, 
+    bRet = ModifyMenuW(clientInfo->hWindowMenu , wndPtr->wIDmenu, 
                       MF_BYCOMMAND | MF_STRING, wndPtr->wIDmenu, buffer );
     CheckMenuItem(clientInfo->hWindowMenu ,wndPtr->wIDmenu , n & MF_CHECKED);
 END:
@@ -157,7 +158,8 @@
  */
 static BOOL MDI_MenuDeleteItem(WND* clientWnd, HWND hWndChild )
 {
-    char    	 buffer[128];
+    WCHAR    	 buffer[128];
+    static const WCHAR format[] = {'&','%','d',' ',0};
     MDICLIENTINFO *clientInfo = (MDICLIENTINFO*)clientWnd->wExtra;
     WND    	*wndPtr     = WIN_FindWndPtr(hWndChild);
     UINT	 index      = 0,id,n;
@@ -190,15 +192,15 @@
 	/* set correct id */
 	tmpWnd->wIDmenu--;
 
-	n = sprintf(buffer, "&%d ",index - clientInfo->idFirstChild);
+	n = wsprintfW(buffer, format ,index - clientInfo->idFirstChild);
 	if (tmpWnd->text)
-            lstrcpynA(buffer + n, tmpWnd->text, sizeof(buffer) - n );	
+            lstrcpynW(buffer + n, tmpWnd->text, sizeof(buffer)/sizeof(WCHAR) - n );	
 
 	/*  change menu if the current child is to be shown in the 
          *  "Windows" menu
          */
         if (index <= clientInfo->idFirstChild + MDI_MOREWINDOWSLIMIT) 
-	ModifyMenuA(clientInfo->hWindowMenu ,index ,MF_BYCOMMAND | MF_STRING,
+	ModifyMenuW(clientInfo->hWindowMenu ,index ,MF_BYCOMMAND | MF_STRING,
                       index - 1 , buffer ); 
         WIN_ReleaseWndPtr(tmpWnd);
     }
@@ -1105,13 +1107,13 @@
  * Note: lpTitle can be NULL
  */
 static void MDI_UpdateFrameText( WND *frameWnd, HWND hClient,
-                                 BOOL repaint, LPCSTR lpTitle )
+                                 BOOL repaint, LPCWSTR lpTitle )
 {
-    char   lpBuffer[MDI_MAXTITLELENGTH+1];
+    WCHAR   lpBuffer[MDI_MAXTITLELENGTH+1];
     WND*   clientWnd = WIN_FindWndPtr(hClient);
     MDICLIENTINFO *ci = (MDICLIENTINFO *) clientWnd->wExtra;
 
-    TRACE("repaint %i, frameText %s\n", repaint, (lpTitle)?lpTitle:"NULL");
+    TRACE("repaint %i, frameText %s\n", repaint, (lpTitle)?debugstr_w(lpTitle):"NULL");
 
     if (!clientWnd)
            return;
@@ -1126,7 +1128,7 @@
     if (lpTitle) 
     {
 	if (ci->frameTitle) HeapFree( SystemHeap, 0, ci->frameTitle );
-	ci->frameTitle = HEAP_strdupA( SystemHeap, 0, lpTitle );
+	ci->frameTitle = HEAP_strdupW( SystemHeap, 0, lpTitle );
     }
 
     if (ci->frameTitle)
@@ -1137,32 +1139,33 @@
 	{
 	    /* combine frame title and child title if possible */
 
-	    LPCSTR lpBracket  = " - [";
-	    int	i_frame_text_length = strlen(ci->frameTitle);
-	    int	i_child_text_length = strlen(childWnd->text);
+	    static const WCHAR lpBracket[]  = {' ','-',' ','[',0};
+	    static const WCHAR lpBracket2[]  = {']',0};
+	    int	i_frame_text_length = lstrlenW(ci->frameTitle);
+	    int	i_child_text_length = lstrlenW(childWnd->text);
 
-	    lstrcpynA( lpBuffer, ci->frameTitle, MDI_MAXTITLELENGTH);
+	    lstrcpynW( lpBuffer, ci->frameTitle, MDI_MAXTITLELENGTH);
 
 	    if( i_frame_text_length + 6 < MDI_MAXTITLELENGTH )
             {
-		strcat( lpBuffer, lpBracket );
+		lstrcatW( lpBuffer, lpBracket );
 
 		if( i_frame_text_length + i_child_text_length + 6 < MDI_MAXTITLELENGTH )
 		{
-		    strcat( lpBuffer, childWnd->text );
-		    strcat( lpBuffer, "]" );
+		    lstrcatW( lpBuffer, childWnd->text );
+		    lstrcatW( lpBuffer, lpBracket2 );
 		}
 		else
 		{
-		    lstrcpynA( lpBuffer + i_frame_text_length + 4, 
+		    lstrcpynW( lpBuffer + i_frame_text_length + 4, 
 				 childWnd->text, MDI_MAXTITLELENGTH - i_frame_text_length - 5 );
-		    strcat( lpBuffer, "]" );
+		    lstrcatW( lpBuffer, lpBracket2 );
 		}
 	    }
 	}
 	else
 	{
-            lstrcpynA(lpBuffer, ci->frameTitle, MDI_MAXTITLELENGTH+1 );
+            lstrcpynW(lpBuffer, ci->frameTitle, MDI_MAXTITLELENGTH+1 );
 	}
         WIN_ReleaseWndPtr(childWnd);
 
@@ -1170,7 +1173,7 @@
     else
 	lpBuffer[0] = '\0';
 
-    DEFWND_SetText( frameWnd, lpBuffer );
+    DEFWND_SetTextW( frameWnd, lpBuffer );
     if( repaint == MDI_REPAINTFRAME)
 	SetWindowPos( frameWnd->hwndSelf, 0,0,0,0,0, SWP_FRAMECHANGED |
 			SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER );
@@ -1486,11 +1489,15 @@
 	    break;
 
 	  case WM_SETTEXT:
-            wndPtr = WIN_FindWndPtr(hwnd);
-            MDI_UpdateFrameText(wndPtr, hwndMDIClient,
-				      MDI_REPAINTFRAME, 
-			             (LPCSTR)PTR_SEG_TO_LIN(lParam));
-            WIN_ReleaseWndPtr(wndPtr);
+            {
+                LPWSTR text = HEAP_strdupAtoW( GetProcessHeap(), 0, 
+                                               (LPCSTR)PTR_SEG_TO_LIN(lParam) );
+                wndPtr = WIN_FindWndPtr(hwnd);
+                MDI_UpdateFrameText(wndPtr, hwndMDIClient,
+                                    MDI_REPAINTFRAME, text );
+                WIN_ReleaseWndPtr(wndPtr);
+                HeapFree( GetProcessHeap(), 0, text );
+            }
 	    return 0;
 	
 	  case WM_SETFOCUS:
@@ -2329,9 +2336,9 @@
                    if (pWnd->wIDmenu == ci->idFirstChild + i)
                        break;
 
-               SendMessageA(hListBox, LB_ADDSTRING, 0, (LPARAM) pWnd->text);
+               SendMessageW(hListBox, LB_ADDSTRING, 0, (LPARAM) pWnd->text);
                SendMessageA(hListBox, LB_SETITEMDATA, i, (LPARAM) pWnd);
-               length = strlen(pWnd->text);
+               length = lstrlenW(pWnd->text);
                WIN_ReleaseWndPtr(pWnd);
 
                if (length > widest)