我每2个星期就要给wine打一次补丁,有点不胜其烦。看了置顶帖的召集很感兴趣,就对目前使用的补丁做了一点分析。我不懂Linux编程,权当抛砖引玉。希望我们的努力能够为Wine官方接受。
首先,我们来看一下那个补丁的详情,依我看来,它并不太脏,只是有一点点脏。
代码: 全选
1 if(lf.lfCharSet == DEFAULT_CHARSET || lf.lfCharSet == ANSI_CHARSET) {
2 int codepage = 936; /* I'm Chinese. Let me do something selfish. */
3 char *env_wdc = getenv("WINE_DEFAULT_CODEPAGE");
4 if(env_wdc != NULL) {
5 codepage = atoi(env_wdc);
6 }
7 FIXME("Dirty hack. Default and ansi charset is translated to getenv(\"WINE_DEFAULT_CODEPAGE\")\n");
8 if(!TranslateCharsetInfo((DWORD*)(INT_PTR)codepage, &csi, TCI_SRCCODEPAGE)) {
9 FIXME("OMG. Even this dirty hack doesn't work. Let's PRAY.\n");
10 csi.fs.fsCsb[0] = 0;
11 }
12 lf.lfCharSet = csi.ciCharset;
13 } else if(!TranslateCharsetInfo((DWORD*)(INT_PTR)lf.lfCharSet, &csi, TCI_SRCCHARSET)) {
14 switch(lf.lfCharSet) {
15 case DEFAULT_CHARSET:
16 csi.fs.fsCsb[0] = 0;
17 break;
18 default:
19 FIXME("Untranslated charset %d\n", lf.lfCharSet);
20 csi.fs.fsCsb[0] = 0;
21 break;
22 }
23 }
1)默认codepage=936,这个可能对其他非中文用户产生影响。
2)虽然后面定义了WINE_DEFAULT_CODEPAGE,但为时已晚,因为这个分支对所有的lfCharset == DEFAULT_CHARSET和lfCharset == ANSI_CHARSET都做了处理,而不进入WINE原版程序的TranslateCharsetInfo((DWORD*)(INT_PTR)lf.lfCharSet...)函数。
我的设想是,我们利用WINE_DEFAULT_CODEPAGE这个参数,如果这个参数没有设置,我们依照Wine原始的逻辑处理,如果设置了,我们就依照这个codepage处理。代码如下:
代码: 全选
int codepage = 0;
char *env_wdc = getenv("WINE_DEFAULT_CODEPAGE");
if(env_wdc != NULL)
codepage = atoi(env_wdc);
if((codepage != 0) && (lf.lfCharSet == DEFAULT_CHARSET || lf.lfCharSet == ANSI_CHARSET)) {
FIXME("WINE_DEFAULT_CODEPAGE=%d, overriding lfCharSet\n", codepage);
if(!TranslateCharsetInfo((DWORD*)(INT_PTR)codepage, &csi, TCI_SRCCODEPAGE)) {
FIXME("OMG. Even this hack doesn't work. Let's PRAY.\n");
csi.fs.fsCsb[0] = 0;
}
lf.lfCharSet = csi.ciCharset;
} else if(!TranslateCharsetInfo((DWORD*)(INT_PTR)lf.lfCharSet, &csi, TCI_SRCCHARSET)) {
switch(lf.lfCharSet) {
case DEFAULT_CHARSET:
csi.fs.fsCsb[0] = 0;
break;
default:
FIXME("Untranslated charset %d\n", lf.lfCharSet);
csi.fs.fsCsb[0] = 0;
break;
}
}
不知我这个方案可行否?请Linux编程高手指导。我对Linux程序的理解仅限于当年大学一年级用HPUX学C语言,以及对man page的阅读。至于为什么要lf.lfCharSet = csi.ciCharset;诸如此类的问题,我就比较迷糊了。