LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3081|回复: 9

求助:tinyx下使用fcitx问题

[复制链接]
发表于 2009-7-15 20:24:52 | 显示全部楼层 |阅读模式
我编译了一个tinyx,想在上面使用fcitx,我交叉编译好fcitx,configure时enable了xft选项,但是在tinyx中运行时有些问题。

输入法的bug如图显示,主窗口的最右边的当前是什么输入发没有画出来,输入窗口的中文也没有显示出来,在最新的3.6版本中,connect_id倒是对的。

刚开始觉得是XIM没有正常初始化照成的,后来发现代码中setlocale()函数的返回是NULL,这个不知道是不是导致XIM没有初始化的原因。或者是为什么setlocale()函数会返回NULL??
我在调用setlocale()函数后跟着调用XSupportsLocale,这个函数返回时非空的。

我想应该有朋友做个这方面的移植,求各位大虾指教,谢谢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2009-7-16 17:51:20 | 显示全部楼层
是不是glibc的中文locale没有安装好?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-17 00:17:34 | 显示全部楼层
Post by Yuking;2006817
是不是glibc的中文locale没有安装好?


哥,您终于出来了,5555~~~
:)

我发现setlocale()函数返回NULL后也一直怀疑是中文环境没有搭建好的问题,今天下午用几个X11小测试程序试了一下setlocale()函数,板子上果然也画不出中文。

是不是setlocale函数会调用到glibc的中文locale库,然后输出中文来?今天jiahua哥建议我装个debian arm试试,我找了很久,发现装个系统还是比较吃力的,要是能直接把 glibc 的中文 locale 补上就好了。

我今天尝试着给glibc添加中文locale,但是网上现成的资料很少,能提供些参考资料嘛?

多谢您百忙中帮我解答问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-17 17:24:26 | 显示全部楼层
继续求学:


今天早上试着安装,把编译器里面的locale相关的全部铐过来了,
# locale -a
显示有zh_CN.gb2312了,setlocale()函数终于没有返回出错,但是程序运行起来还是和上面截图一样,还是没有能把中文字体画出来

找了个小程序来测试(在x86正常显示)在setlocale()也没有报错了,在板子上还是不能输出中文。晚上继续看看,先弄明白小程序的中文为什么也画不出来~

用于测试输出 "abc 你好“的小程序,网上找的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iconv.h>

#include <X11/Xlib.h>
#include <X11/Xutil.h>
/*
#include <locale.h>
*/
#include <X11/Xlocale.h>

void DrawCenteredMbString ( Display *, Window, XFontSet, GC, char*, int, int,
                                int, int, int );

int
main (argc, argv)
        int argc;
        char *argv[];
{
        Display *dpy;
        Window w;
        XFontSet fontset;
        char **missing_charsets;
        int num_missing_charsets;
        char *default_string;
        int i;
        GC gc;
        XEvent xe;
                char *p;
                char locale[100];

        char *program_name = argv[0];

        p = setlocale (LC_CTYPE,"");
        if ( !p ) {
        //if ( setlocale (LC_ALL,"") == NULL ) {
                fprintf (stderr, "%s: setlocale fail.\n",
                program_name );
                //exit (1);
        }
                else
                {
                        strcpy(locale, p);
                        fprintf(stderr, "%s: locale is (%s)\n", program_name, locale);
                }

        if ( !XSupportsLocale() ) {
                fprintf (stderr,"%s: X does not support locale %s.\n",
                program_name, setlocale( LC_ALL, NULL ) );
                exit (1);
        }

        if ( XSetLocaleModifiers("") == NULL ) {
                fprintf (stderr,
                        "%s: Warning: setlocalemodifiers fail.\n",
                        program_name);
        }

        dpy = XOpenDisplay ( NULL);
        w = XCreateSimpleWindow ( dpy, RootWindow( dpy, 0 ), 50, 50,
                                        100, 50, 5, BlackPixel( dpy, 0 ),
                                        WhitePixel( dpy, 0 ) );
        gc = XCreateGC ( dpy, w, 0L, ( XGCValues * ) NULL );

        fontset = XCreateFontSet (dpy, "-*-*-*-*-*-*-16-*-*-*-*-*-*-*",
                        &missing_charsets, &num_missing_charsets,
                        &default_string);
        if ( num_missing_charsets > 0 ) {
                (void) fprintf (stderr,
                        "%s: The following charsets are missing:\n",
                        program_name);
                for ( i=0; i < num_missing_charsets; i++ )
                        (void)fprintf (stderr, "%s: %s\n", program_name,
                                missing_charsets);
                (void) fprintf (stderr, "%s: The string is %s\n", program_name,
                                default_string);
                (void) fprintf (stderr,
                                "%s: of any characters from those sets\n",
                                program_name);
                XFreeStringList (missing_charsets);
        }

        XSetLineAttributes ( dpy, gc, 5, LineSolid, CapRound, JoinRound );

        XSelectInput ( dpy, w, ExposureMask | ButtonPressMask
                        | EnterWindowMask | LeaveWindowMask );

        XMapWindow ( dpy, w );

        XFlush ( dpy );

        while ( True )
        {
                XNextEvent ( dpy, &xe );

                switch ( xe.type ) {

                case Expose:
                        printf ("Expose 出现.\n");
                        XSetForeground ( dpy, gc, BlackPixel( dpy, 0 ) );
                        DrawCenteredMbString ( dpy, w, fontset, gc,
                                        "abc 你好",
                                        10, 0, 0, 100, 50 );
                        break;
                case ButtonPress:
                        printf ("按下!\n");
                        exit (1);
                        break;
                case EnterNotify:
                        printf ("进入.\n");
                        XSetForeground ( dpy, gc, BlackPixel( dpy, 0 ) );
                        XDrawRectangle ( dpy, w, gc, 0, 0, 100, 50 );
                        break;
                case LeaveNotify:
                        printf ("离开.\n");
                        XSetForeground ( dpy, gc, WhitePixel( dpy, 0 ) );
                        XDrawRectangle ( dpy, w, gc, 0, 0, 100, 50 );
                        break;
                default:
                        printf ("默认.\n");
                        break;
                }
        }
        return 0;
}

void
DrawCenteredMbString (dpy, w, fontset, gc, str, num_bytes, x, y, width, height )
        Display *dpy;
        Window w;
        XFontSet fontset;
        GC gc;
        char *str;
        int num_bytes;
        int x,y, width, height;
{
        XRectangle boundingbox;
        XRectangle dummy;
        int originx, originy;

        (void) XmbTextExtents (fontset, str, num_bytes, &dummy, &boundingbox);

        originx = x + ( width - boundingbox.width )/2 - boundingbox.x;
        originy = y + ( height - boundingbox.height)/2 - boundingbox.y;

        XmbDrawString (dpy, w, fontset, gc, originx, originy, str, num_bytes);
}
回复 支持 反对

使用道具 举报

发表于 2009-7-18 16:03:56 | 显示全部楼层
建议增加gb18030和UTF8的支持试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-18 18:03:43 | 显示全部楼层
我试过了zh_CN.GB18030,zh_CN.GBk和zh_CN.UTF-8,用类似这个
# localedef -f UTF-8 -i zh_CN zh_CN.UTF-8
的命令来安装的时候,都没有成功,仅仅是GB2312安装成功了,所以我选了这个,localedef出错但是没有任何报错,直接无响应后返回Killed,这里没搞明白。

我另外一个试验用的PC机上的locale是:
[root@samfei46 run]# locale
LANG=zh_CN.GB2312
LC_CTYPE=zh_CN.GB2312
LC_NUMERIC="zh_CN.GB2312"
LC_TIME="zh_CN.GB2312"
LC_COLLATE="zh_CN.GB2312"
LC_MONETARY="zh_CN.GB2312"
LC_MESSAGES="zh_CN.GB2312"
LC_PAPER="zh_CN.GB2312"
LC_NAME="zh_CN.GB2312"
LC_ADDRESS="zh_CN.GB2312"
LC_TELEPHONE="zh_CN.GB2312"
LC_MEASUREMENT="zh_CN.GB2312"
LC_IDENTIFICATION="zh_CN.GB2312"
LC_ALL=

输入法和测试程序都能正常运行,不过测试程序的中文显示不正常,但是至少”你好“还是能以乱码的形式显示出来。现在系统也已经有了一个中文的locale,我想是不是先能让它画出来,或者说是主窗口的最右边的当前是什么输入法的那个先能出来,还有inputwindow
所以我开始怀疑是字体了,您觉得可能会是哪方面的原因?多说几个可能的也不要紧,我多试试就好了,就怕完全没有线索。

调试输入法这个已经过了两周了,估计今后上班时间不能再调试这个bug了,不过以后下班业余时间我会继续试,当做学东西吧,谢谢suzhe指导
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-18 18:18:44 | 显示全部楼层
我安装locale的方法是把arm编译器下面的 locale 和 i18n相关的目录拷贝过去,然后执行:
# localedef -f UTF-8 -i zh_CN zh_CN.UTF-8

不知道这个步骤是不是漏了什么没有?
拷贝编译器的目录和文件到相应的系统目录分别是:
./arm/usr/share/locale
./arm/usr/share/i18n/
./arm/usr/bin/locale
./arm/usr/bin/localedef


locale -a的显示:
[root@lyt /]# localedef -f GB2312 -i zh_CN zh_CN.GB2312   
[root@lyt /]# localedef -f UTF-8 -i zh_CN zh_CN.UTF-8
Killed
[root@lyt /]# locale -a
C
POSIX
zh_CN.gb2312
[root@lyt /]#
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-20 16:39:17 | 显示全部楼层
还有个X locale也拷贝了,X11程序还是不能输出中文。但是系统的locale已经安装上了,安装上了gbk和gb2312,推荐的gb18030和utf-8没有装上。

看来问题还是在tinyx这个系统?
回复 支持 反对

使用道具 举报

发表于 2009-7-30 15:13:18 | 显示全部楼层
我在PC的TinyX上用GB2312能显示出中文,但不知道为什么在ARM上生成的locale文件没起作用。板子上内存不足生成GB18030和UTF-8都不成功,试不了,而且fcitx的键盘点不了,inputwindow也看不到,打印信息显示在VKMouseKey()中icid=0, connect_id=0。我尝试了XIM的小程序,到XOpenIM那里就返回失败了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-18 10:14:39 | 显示全部楼层
Post by Yuking;2006817
是不是glibc的中文locale没有安装好?


是 locale没弄好的问题,后来拖了很久才解决,忘记结贴了,不好意思
多谢Yuking
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表