博文

目前显示的是 十二月, 2005的博文

让你的X11支持中日韩文字

(由于我的X11不支持中文locale,所以我就一篇探寻,一边写了这篇帖子)我的操作系统是FreeBSD 6.0,X11是cvsup中的最新版gtk_set_locale溯源由于我的gtk老是报告说"locale not supported by C library",我决定仔细的调试下看问题出在哪里。首先,gtk程序一般都要先调用gtk_set_locale()函数,然后gtk_set_locale调用gdk_set_locale,gtk_set_locale调用setlocale,XSetlocaleModifiers,XSupportLocale,由于我的setlocale没有问题,所以我就向Xlib进发。在lcWrap.c中找到了XSupportLocale,XSupportLocale调用_XlcCurrentLC(),如果_XlcCurrentLC()返回NULL,就代表失败,于是XSupportLocale返回false;_XlcCurrentLC()调用_XOpenLC((char *) NULL),然后关闭last_lcd, 并设置静态变量last_lcd为_XOpenLC的返回值。但是这个_XOpenLC函数就比较复杂了。_XOpenLC首先调用name=setlocale (LC_CTYPE, (char *)NULL)获得当前的LC_CTYPE设置,然后如果在配置文件中没有定义X_LOCALE 这个宏参数,那么需要调用_XlcMapOSLocaleName将setlocale的返回值translate一下。(在BSD上这是需要的)._XlcMapOSLocaleName返回的依然是原来的name,或者是原来name的一个子字符串。然后下面加一把锁子。因为这里需要访问并修改静态全局变量lcd_list.首先先在lcd_list中查找name,如果找到,把这个lcd的引用计数加1,并解锁返回。如果没有找到。就看静态变量loader_list是否为NULL,是NULL的话就调用_XlcInitLoader();loader_list其实一个是一个很简单的链表。每个元素里面包含一个类型为XLCdLoadProc的函数指针。这是它的函数原型typedefXLCd(*XLCdLoadProc)( constchar* …