Hello, This is an implementation of a generalized support for CP_UNIXCP. File APIs can't be converted yet due to dll separation issues. Changelog: Dmitry Timoshkov <dmitry@codeweavers.com> Add support for CP_UNIXCP. diff -u cvs/hq/wine/dlls/kernel/locale.c wine/dlls/kernel/locale.c --- cvs/hq/wine/dlls/kernel/locale.c Sat Jun 28 14:30:49 2003 +++ wine/dlls/kernel/locale.c Tue Jul 1 20:00:56 2003 @@ -43,7 +43,60 @@ WINE_DEFAULT_DEBUG_CHANNEL(nls); #define LOCALE_LOCALEINFOFLAGSMASK (LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP|LOCALE_RETURN_NUMBER) -extern void CODEPAGE_Init( UINT ansi, UINT oem, UINT mac, LCID lcid ); +extern void CODEPAGE_Init( UINT ansi_cp, UINT oem_cp, UINT mac_cp, UINT unix_cp, LCID lcid ); + +/* Charset to codepage map, sorted by name. */ +struct charset_entry +{ + const char *charset_name; + const UINT codepage; +} charset_names[] = +{ + { "CP1250", 1250 }, + { "CP1251", 1251 }, + { "CP1252", 1252 }, + { "CP1253", 1253 }, + { "CP1254", 1254 }, + { "CP1255", 1255 }, + { "CP1256", 1256 }, + { "CP1257", 1257 }, + { "CP1258", 1258 }, + { "IBM037", 37 }, + { "IBM1026", 1026 }, + { "IBM424", 424 }, + { "IBM437", 437 }, + { "IBM500", 500 }, + { "IBM850", 850 }, + { "IBM852", 852 }, + { "IBM855", 855 }, + { "IBM857", 857 }, + { "IBM860", 860 }, + { "IBM861", 861 }, + { "IBM862", 862 }, + { "IBM863", 863 }, + { "IBM864", 864 }, + { "IBM865", 865 }, + { "IBM866", 866 }, + { "IBM869", 869 }, + { "IBM874", 874 }, + { "IBM875", 875 }, + { "ISO-8859-1", 28591 }, + { "ISO-8859-10", 28600 }, + { "ISO-8859-13", 28603 }, + { "ISO-8859-14", 28604 }, + { "ISO-8859-15", 28605 }, + { "ISO-8859-2", 28592 }, + { "ISO-8859-3", 28593 }, + { "ISO-8859-4", 28594 }, + { "ISO-8859-5", 28595 }, + { "ISO-8859-6", 28596 }, + { "ISO-8859-7", 28597 }, + { "ISO-8859-8", 28598 }, + { "ISO-8859-9", 28599 }, + { "KOI8-R", 20866 }, + { "KOI8-U", 20866 }, + { "UTF-8", CP_UTF8 } +}; #define NLS_MAX_LANGUAGES 20 typedef struct { @@ -334,9 +387,18 @@ END: /*********************************************************************** + * charset_cmp (internal) + */ +static int charset_cmp( const void *name, const void *entry ) +{ + struct charset_entry *charset = (struct charset_entry *)entry; + return strcasecmp( (char *)name, charset->charset_name ); +} + +/*********************************************************************** * init_default_lcid */ -static LCID init_default_lcid(void) +static LCID init_default_lcid( UINT *unix_cp ) { char buf[256]; char *lang,*country,*charset,*dialect,*next; @@ -359,6 +421,19 @@ static LCID init_default_lcid(void) country=strchr(lang,'_'); if (country) *country++='\0'; ret = get_language_id(lang, country, charset, dialect); + if (ret && charset) + { + struct charset_entry *entry; + entry = bsearch( charset, charset_names, sizeof(charset_names)/sizeof(charset_names[0]), + sizeof(charset_names[0]), charset_cmp ); + if (entry) + { + *unix_cp = entry->codepage; + TRACE("charset %s was mapped to cp %u\n", charset, *unix_cp); + } + else + FIXME("charset %s was not recognized\n", charset); + } lang=next; } while (lang && !ret); @@ -1312,20 +1387,23 @@ int WINAPI lstrcmpiW(LPCWSTR str1, LPCWS */ void LOCALE_Init(void) { - UINT ansi = 1252, oem = 437, mac = 10000; - LCID lcid = init_default_lcid(); + UINT ansi_cp = 1252, oem_cp = 437, mac_cp = 10000, unix_cp = -1; + LCID lcid = init_default_lcid( &unix_cp ); NtSetDefaultLocale( FALSE, lcid ); NtSetDefaultLocale( TRUE, lcid ); GetLocaleInfoW( lcid, LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER, - (LPWSTR)&ansi, sizeof(ansi)/sizeof(WCHAR) ); + (LPWSTR)&ansi_cp, sizeof(ansi_cp)/sizeof(WCHAR) ); GetLocaleInfoW( lcid, LOCALE_IDEFAULTMACCODEPAGE | LOCALE_RETURN_NUMBER, - (LPWSTR)&mac, sizeof(mac)/sizeof(WCHAR) ); + (LPWSTR)&mac_cp, sizeof(mac_cp)/sizeof(WCHAR) ); GetLocaleInfoW( lcid, LOCALE_IDEFAULTCODEPAGE | LOCALE_RETURN_NUMBER, - (LPWSTR)&oem, sizeof(oem)/sizeof(WCHAR) ); + (LPWSTR)&oem_cp, sizeof(oem_cp)/sizeof(WCHAR) ); + if (unix_cp == -1) + GetLocaleInfoW( lcid, LOCALE_IDEFAULTUNIXCODEPAGE | LOCALE_RETURN_NUMBER, + (LPWSTR)&unix_cp, sizeof(unix_cp)/sizeof(WCHAR) ); - CODEPAGE_Init( ansi, oem, mac, lcid ); + CODEPAGE_Init( ansi_cp, oem_cp, mac_cp, unix_cp, lcid ); update_registry( lcid ); } diff -u cvs/hq/wine/dlls/x11drv/clipboard.c wine/dlls/x11drv/clipboard.c --- cvs/hq/wine/dlls/x11drv/clipboard.c Wed Jun 25 15:58:49 2003 +++ wine/dlls/x11drv/clipboard.c Tue Jul 1 21:04:22 2003 @@ -938,7 +938,6 @@ HANDLE X11DRV_CLIPBOARD_ImportXAString(L if ((lpstr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cBytes + inlcount + 1))) { UINT count; - UINT text_cp = CP_ACP; for (i = 0, inlcount = 0; i <= cBytes; i++) { @@ -948,16 +947,13 @@ HANDLE X11DRV_CLIPBOARD_ImportXAString(L lpstr[inlcount++] = lpdata[i]; } - GetLocaleInfoW(LOCALE_SYSTEM_DEFAULT, LOCALE_IDEFAULTUNIXCODEPAGE | - LOCALE_RETURN_NUMBER, (WCHAR *)&text_cp, (sizeof(UINT)/sizeof(WCHAR))); - - count = MultiByteToWideChar(text_cp, 0, lpstr, -1, NULL, 0); + count = MultiByteToWideChar(CP_UNIXCP, 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); + MultiByteToWideChar(CP_UNIXCP, 0, lpstr, -1, textW, count); GlobalUnlock(hUnicodeText); } @@ -1085,13 +1081,9 @@ HANDLE X11DRV_CLIPBOARD_ExportXAString(L UINT size; LPWSTR uni_text; LPSTR text, lpstr; - UINT text_cp = CP_ACP; *lpBytes = 0; /* Assume return has zero bytes */ - GetLocaleInfoW(LOCALE_SYSTEM_DEFAULT, LOCALE_IDEFAULTUNIXCODEPAGE | - LOCALE_RETURN_NUMBER, (WCHAR *)&text_cp, (sizeof(UINT)/sizeof(WCHAR))); - if (!X11DRV_CLIPBOARD_RenderFormat(lpData)) { ERR("Failed to export %d format\n", lpData->wFormatID); @@ -1100,12 +1092,12 @@ HANDLE X11DRV_CLIPBOARD_ExportXAString(L uni_text = GlobalLock(lpData->hData32); - size = WideCharToMultiByte(text_cp, 0, uni_text, -1, NULL, 0, NULL, NULL); + size = WideCharToMultiByte(CP_UNIXCP, 0, uni_text, -1, NULL, 0, NULL, NULL); text = HeapAlloc(GetProcessHeap(), 0, size); if (!text) return None; - WideCharToMultiByte(text_cp, 0, uni_text, -1, text, size, NULL, NULL); + WideCharToMultiByte(CP_UNIXCP, 0, uni_text, -1, text, size, NULL, NULL); /* remove carriage returns */ diff -u cvs/hq/wine/dlls/x11drv/keyboard.c wine/dlls/x11drv/keyboard.c --- cvs/hq/wine/dlls/x11drv/keyboard.c Wed Jun 25 15:58:49 2003 +++ wine/dlls/x11drv/keyboard.c Tue Jul 1 20:12:23 2003 @@ -670,63 +670,62 @@ static const char main_key_vnc[MAIN_LEN] /*** Layout table. Add your keyboard mappings to this list */ static const struct { const char *comment; - const UINT layout_cp; /* Code page for this layout */ const char (*key)[MAIN_LEN][4]; const WORD (*scan)[MAIN_LEN]; /* scan codes mapping */ const WORD (*vkey)[MAIN_LEN]; /* virtual key codes mapping */ } main_key_tab[]={ - {"United States keyboard layout", 28591, &main_key_US, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"United States keyboard layout (phantom key version)", 28591, &main_key_US_phantom, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"United States keyboard layout (dvorak)", 28591, &main_key_US_dvorak, &main_key_scan_dvorak, &main_key_vkey_dvorak}, - {"British keyboard layout", 28605, &main_key_UK, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"German keyboard layout", 28605, &main_key_DE, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"German keyboard layout without dead keys", 28605, &main_key_DE_nodead, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"German keyboard layout for logitech desktop pro", 28605, &main_key_DE_logitech, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"German keyboard layout without dead keys 105", 28605, &main_key_DE_nodead_105, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Swiss German keyboard layout", 28605, &main_key_SG, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Swedish keyboard layout", 28605, &main_key_SE, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Estonian keyboard layout", 28605, &main_key_ET, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Norwegian keyboard layout", 28605, &main_key_NO, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Danish keyboard layout", 28605, &main_key_DA, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"French keyboard layout", 28605, &main_key_FR, &main_key_scan_qwerty, &main_key_vkey_azerty}, - {"Canadian French keyboard layout", 28591, &main_key_CF, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Belgian keyboard layout", 28605, &main_key_BE, &main_key_scan_qwerty, &main_key_vkey_azerty}, - {"Swiss French keyboard layout", 28605, &main_key_SF, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Portuguese keyboard layout", 28605, &main_key_PT, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Brazilian ABNT-2 keyboard layout", 28591, &main_key_PT_br, &main_key_scan_abnt_qwerty, &main_key_vkey_abnt_qwerty}, - {"Brazilian ABNT-2 keyboard layout ALT GR", 28591, &main_key_PT_br_alt_gr,&main_key_scan_abnt_qwerty, &main_key_vkey_abnt_qwerty}, - {"United States International keyboard layout", 28591, &main_key_US_intl, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Finnish keyboard layout", 28605, &main_key_FI, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Bulgarian bds keyboard layout", 1251, &main_key_BG_bds, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Bulgarian phonetic keyboard layout", 1251, &main_key_BG_phonetic, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Belarusian keyboard layout", 1251, &main_key_BY, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Russian keyboard layout", 20866, &main_key_RU, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Russian keyboard layout (phantom key version)", 20866, &main_key_RU_phantom, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Russian keyboard layout KOI8-R", 20866, &main_key_RU_koi8r, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Ukrainian keyboard layout KOI8-U", 20866, &main_key_UA, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Spanish keyboard layout", 28605, &main_key_ES, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Italian keyboard layout", 28605, &main_key_IT, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Icelandic keyboard layout", 28605, &main_key_IS, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Hungarian keyboard layout", 28592, &main_key_HU, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Polish (programmer's) keyboard layout", 28592, &main_key_PL, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Slovenian keyboard layout", 28592, &main_key_SI, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Croatian keyboard layout", 28592, &main_key_HR, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Croatian keyboard layout (specific)", 28592, &main_key_HR_jelly, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Japanese 106 keyboard layout", 932, &main_key_JA_jp106, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Japanese pc98x1 keyboard layout", 932, &main_key_JA_pc98x1, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Slovak keyboard layout", 28592, &main_key_SK, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Slovak and Czech keyboard layout without dead keys", 28592, &main_key_SK_prog, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Czech keyboard layout", 28592, &main_key_CS, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Czech keyboard layout cz", 28592, &main_key_CZ, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Czech keyboard layout cz_qwerty", 28592, &main_key_CZ_qwerty, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Latin American keyboard layout", 28591, &main_key_LA, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Lithuanian (Baltic) keyboard layout", 28603, &main_key_LT_B, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Turkish keyboard layout", 28599, &main_key_TK, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"Israeli keyboard layout", 28598, &main_key_IL, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {"VNC keyboard layout", 28605, &main_key_vnc, &main_key_scan_vnc, &main_key_vkey_vnc}, - {"Greek keyboard layout", 28597, &main_key_EL, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"United States keyboard layout", &main_key_US, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"United States keyboard layout (phantom key version)", &main_key_US_phantom, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"United States keyboard layout (dvorak)", &main_key_US_dvorak, &main_key_scan_dvorak, &main_key_vkey_dvorak}, + {"British keyboard layout", &main_key_UK, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"German keyboard layout", &main_key_DE, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"German keyboard layout without dead keys", &main_key_DE_nodead, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"German keyboard layout for logitech desktop pro", &main_key_DE_logitech, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"German keyboard layout without dead keys 105", &main_key_DE_nodead_105, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Swiss German keyboard layout", &main_key_SG, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Swedish keyboard layout", &main_key_SE, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Estonian keyboard layout", &main_key_ET, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Norwegian keyboard layout", &main_key_NO, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Danish keyboard layout", &main_key_DA, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"French keyboard layout", &main_key_FR, &main_key_scan_qwerty, &main_key_vkey_azerty}, + {"Canadian French keyboard layout", &main_key_CF, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Belgian keyboard layout", &main_key_BE, &main_key_scan_qwerty, &main_key_vkey_azerty}, + {"Swiss French keyboard layout", &main_key_SF, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Portuguese keyboard layout", &main_key_PT, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Brazilian ABNT-2 keyboard layout", &main_key_PT_br, &main_key_scan_abnt_qwerty, &main_key_vkey_abnt_qwerty}, + {"Brazilian ABNT-2 keyboard layout ALT GR", &main_key_PT_br_alt_gr,&main_key_scan_abnt_qwerty, &main_key_vkey_abnt_qwerty}, + {"United States International keyboard layout", &main_key_US_intl, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Finnish keyboard layout", &main_key_FI, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Bulgarian bds keyboard layout", &main_key_BG_bds, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Bulgarian phonetic keyboard layout", &main_key_BG_phonetic, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Belarusian keyboard layout", &main_key_BY, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Russian keyboard layout", &main_key_RU, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Russian keyboard layout (phantom key version)", &main_key_RU_phantom, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Russian keyboard layout KOI8-R", &main_key_RU_koi8r, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Ukrainian keyboard layout KOI8-U", &main_key_UA, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Spanish keyboard layout", &main_key_ES, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Italian keyboard layout", &main_key_IT, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Icelandic keyboard layout", &main_key_IS, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Hungarian keyboard layout", &main_key_HU, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Polish (programmer's) keyboard layout", &main_key_PL, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Slovenian keyboard layout", &main_key_SI, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Croatian keyboard layout", &main_key_HR, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Croatian keyboard layout (specific)", &main_key_HR_jelly, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Japanese 106 keyboard layout", &main_key_JA_jp106, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Japanese pc98x1 keyboard layout", &main_key_JA_pc98x1, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Slovak keyboard layout", &main_key_SK, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Slovak and Czech keyboard layout without dead keys", &main_key_SK_prog, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Czech keyboard layout", &main_key_CS, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Czech keyboard layout cz", &main_key_CZ, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Czech keyboard layout cz_qwerty", &main_key_CZ_qwerty, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Latin American keyboard layout", &main_key_LA, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Lithuanian (Baltic) keyboard layout", &main_key_LT_B, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Turkish keyboard layout", &main_key_TK, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"Israeli keyboard layout", &main_key_IL, &main_key_scan_qwerty, &main_key_vkey_qwerty}, + {"VNC keyboard layout", &main_key_vnc, &main_key_scan_vnc, &main_key_vkey_vnc}, + {"Greek keyboard layout", &main_key_EL, &main_key_scan_qwerty, &main_key_vkey_qwerty}, - {NULL, 0, NULL, NULL, NULL} /* sentinel */ + {NULL, NULL, NULL, NULL} /* sentinel */ }; static unsigned kbd_layout=0; /* index into above table of layouts */ @@ -1847,7 +1846,7 @@ INT X11DRV_ToUnicode(UINT virtKey, UINT dead_char = KEYBOARD_MapDeadKeysym(keysym); if (dead_char) { - MultiByteToWideChar(main_key_tab[kbd_layout].layout_cp, 0, &dead_char, 1, bufW, bufW_size); + MultiByteToWideChar(CP_UNIXCP, 0, &dead_char, 1, bufW, bufW_size); ret = -1; } else @@ -1906,9 +1905,8 @@ INT X11DRV_ToUnicode(UINT virtKey, UINT /* perform translation to unicode */ if(ret) { - TRACE_(key)("Translating char 0x%02x from code page %d to unicode\n", - *(BYTE *)lpChar, main_key_tab[kbd_layout].layout_cp); - ret = MultiByteToWideChar(main_key_tab[kbd_layout].layout_cp, 0, lpChar, ret, bufW, bufW_size); + TRACE_(key)("Translating char 0x%02x to unicode\n", *(BYTE *)lpChar); + ret = MultiByteToWideChar(CP_UNIXCP, 0, lpChar, ret, bufW, bufW_size); } } diff -u cvs/hq/wine/dlls/x11drv/window.c wine/dlls/x11drv/window.c --- cvs/hq/wine/dlls/x11drv/window.c Wed Jun 25 15:58:49 2003 +++ wine/dlls/x11drv/window.c Tue Jul 1 20:52:20 2003 @@ -794,36 +794,19 @@ BOOL X11DRV_SetWindowText( HWND hwnd, LP UINT count; char *buffer; char *utf8_buffer; - static UINT text_cp = (UINT)-1; Window win; XTextProperty prop; if ((win = X11DRV_get_whole_window( hwnd ))) { - if (text_cp == (UINT)-1) - { - HKEY hkey; - /* default value */ - text_cp = CP_ACP; - if(!RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\x11drv", &hkey)) - { - char buffer[20]; - DWORD type, count = sizeof(buffer); - if(!RegQueryValueExA(hkey, "TextCP", 0, &type, buffer, &count)) - text_cp = atoi(buffer); - RegCloseKey(hkey); - } - TRACE("text_cp = %u\n", text_cp); - } - /* allocate new buffer for window text */ - count = WideCharToMultiByte(text_cp, 0, text, -1, NULL, 0, NULL, NULL); + count = WideCharToMultiByte(CP_UNIXCP, 0, text, -1, NULL, 0, NULL, NULL); if (!(buffer = HeapAlloc( GetProcessHeap(), 0, count ))) { ERR("Not enough memory for window text\n"); return FALSE; } - WideCharToMultiByte(text_cp, 0, text, -1, buffer, count, NULL, NULL); + WideCharToMultiByte(CP_UNIXCP, 0, text, -1, buffer, count, NULL, NULL); count = WideCharToMultiByte(CP_UTF8, 0, text, strlenW(text), NULL, 0, NULL, NULL); if (!(utf8_buffer = HeapAlloc( GetProcessHeap(), 0, count ))) diff -u cvs/hq/wine/documentation/configuring.sgml wine/documentation/configuring.sgml --- cvs/hq/wine/documentation/configuring.sgml Wed May 7 14:54:43 2003 +++ wine/documentation/configuring.sgml Tue Jul 1 21:09:58 2003 @@ -2851,18 +2851,6 @@ with the <literal>GraphicsDriver</litera </para> </listitem> </varlistentry> - <varlistentry> - <term>TextCP</term> - <listitem> - <para> - Codepage to be used for rendering the text in X11 - output. Some sample values would be 437 (USA, Canada), - 850 (Europe), 852 (Central/Eastern Europe), 855 - (Cyrillic). For additional suitable values, see e.g. the Linux - kernel's codepage configuration page. - </para> - </listitem> - </varlistentry> </variablelist> </sect3> </sect2> diff -u cvs/hq/wine/documentation/samples/config wine/documentation/samples/config --- cvs/hq/wine/documentation/samples/config Sat Jun 7 19:15:47 2003 +++ wine/documentation/samples/config Tue Jul 1 21:08:07 2003 @@ -135,9 +135,6 @@ WINE REGISTRY Version 2 ; Create the desktop window with a double-buffered visual ; (useful to play OpenGL games) "DesktopDoubleBuffered" = "N" -; Code page used for captions in managed mode -; 0 means default ANSI code page (CP_ACP == 0) -"TextCP" = "0" ; Use this if you have more than one port for video on your setup ; (Wine uses for now the first 'input image' it finds). ;; "XVideoPort" = "43" diff -u cvs/hq/wine/include/winnls.h wine/include/winnls.h --- cvs/hq/wine/include/winnls.h Sat Jun 28 14:30:54 2003 +++ wine/include/winnls.h Tue Jul 1 16:53:35 2003 @@ -176,6 +176,8 @@ extern "C" { #define CP_UTF7 65000 #define CP_UTF8 65001 +#define CP_UNIXCP 65010 /* Wine extension */ + #define WC_DISCARDNS 0x00000010 #define WC_SEPCHARS 0x00000020 #define WC_DEFAULTCHAR 0x00000040 diff -u cvs/hq/wine/memory/codepage.c wine/memory/codepage.c --- cvs/hq/wine/memory/codepage.c Tue Jul 1 18:39:01 2003 +++ wine/memory/codepage.c Tue Jul 1 20:02:42 2003 @@ -32,10 +32,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(string); +/* fake cp_info structure for CP_UNIXCP UTF-8 support */ +static const struct cp_info utf8_info = { CP_UTF8, 0, 0, 0, "UTF-8" }; + /* current code pages */ static const union cptable *ansi_cptable; static const union cptable *oem_cptable; static const union cptable *mac_cptable; +static const union cptable *unix_cptable; static LCID default_lcid = MAKELCID( MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT), SORT_DEFAULT ); /* setup default codepage info before we can get at the locale stuff */ @@ -44,9 +48,11 @@ static void init_codepages(void) ansi_cptable = wine_cp_get_table( 1252 ); oem_cptable = wine_cp_get_table( 437 ); mac_cptable = wine_cp_get_table( 10000 ); + unix_cptable = wine_cp_get_table( 28591 ); assert( ansi_cptable ); assert( oem_cptable ); assert( mac_cptable ); + assert( unix_cptable ); } /* find the table for a given codepage, handling CP_ACP etc. pseudo-codepages */ @@ -83,21 +89,27 @@ static const union cptable *get_codepage /* initialize default code pages from locale info */ /* FIXME: should be done in init_codepages, but it can't right now */ /* since it needs KERNEL32 to be loaded for the locale info. */ -void CODEPAGE_Init( UINT ansi, UINT oem, UINT mac, LCID lcid ) +void CODEPAGE_Init( UINT ansi_cp, UINT oem_cp, UINT mac_cp, UINT unix_cp, LCID lcid ) { - extern void __wine_init_codepages( const union cptable *ansi, const union cptable *oem ); + extern void __wine_init_codepages( const union cptable *ansi_cp, const union cptable *oem_cp ); const union cptable *table; default_lcid = lcid; if (!ansi_cptable) init_codepages(); /* just in case */ - if ((table = wine_cp_get_table( ansi ))) ansi_cptable = table; - if ((table = wine_cp_get_table( oem ))) oem_cptable = table; - if ((table = wine_cp_get_table( mac ))) mac_cptable = table; + if ((table = wine_cp_get_table( ansi_cp ))) ansi_cptable = table; + if ((table = wine_cp_get_table( oem_cp ))) oem_cptable = table; + if ((table = wine_cp_get_table( mac_cp ))) mac_cptable = table; + if (unix_cp == CP_UTF8) + unix_cptable = (const union cptable *)&utf8_info; + else if ((table = wine_cp_get_table( unix_cp ))) + unix_cptable = table; + __wine_init_codepages( ansi_cptable, oem_cptable ); - TRACE( "ansi=%03d oem=%03d mac=%03d\n", ansi_cptable->info.codepage, - oem_cptable->info.codepage, mac_cptable->info.codepage ); + TRACE( "ansi=%03d oem=%03d mac=%03d unix=%03d\n", + ansi_cptable->info.codepage, oem_cptable->info.codepage, + mac_cptable->info.codepage, unix_cptable->info.codepage ); } /****************************************************************************** @@ -336,9 +348,16 @@ INT WINAPI MultiByteToWideChar( UINT pag switch(page) { case CP_UTF7: - FIXME("UTF not supported\n"); + FIXME("UTF-7 not supported\n"); SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); return 0; + case CP_UNIXCP: + if (unix_cptable->info.codepage != CP_UTF8) + { + ret = wine_cp_mbstowcs( unix_cptable, flags, src, srclen, dst, dstlen ); + break; + } + /* fall through */ case CP_UTF8: ret = wine_utf8_mbstowcs( flags, src, srclen, dst, dstlen ); break; @@ -412,6 +431,14 @@ INT WINAPI WideCharToMultiByte( UINT pag FIXME("UTF-7 not supported\n"); SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); return 0; + case CP_UNIXCP: + if (unix_cptable->info.codepage != CP_UTF8) + { + ret = wine_cp_wcstombs( unix_cptable, flags, src, srclen, dst, dstlen, + defchar, used ? &used_tmp : NULL ); + break; + } + /* fall through */ case CP_UTF8: ret = wine_utf8_wcstombs( src, srclen, dst, dstlen ); break; diff -u cvs/hq/wine/programs/winecfg/properties.h wine/programs/winecfg/properties.h --- cvs/hq/wine/programs/winecfg/properties.h Tue Apr 1 04:41:55 2003 +++ wine/programs/winecfg/properties.h Tue Jul 1 21:10:33 2003 @@ -68,7 +68,6 @@ typedef struct int nTakeFocus; int nDXGrab; int nDoubleBuffered; - int nTextCP; int nXVideoPort; int nSynchronous; } X11DRV_DESC; diff -u cvs/hq/wine/programs/winecfg/winecfg.c wine/programs/winecfg/winecfg.c --- cvs/hq/wine/programs/winecfg/winecfg.c Mon Apr 28 22:07:07 2003 +++ wine/programs/winecfg/winecfg.c Tue Jul 1 21:10:58 2003 @@ -214,7 +214,6 @@ int loadConfig (WINECFG_DESC* pCfg) pCfg->sX11Drv.nTakeFocus = 1; pCfg->sX11Drv.nDXGrab = 0; pCfg->sX11Drv.nDoubleBuffered = 0; - pCfg->sX11Drv.nTextCP = 0; pCfg->sX11Drv.nXVideoPort = 43; pCfg->sX11Drv.nSynchronous = 1;