在FreeBSD的Flash里输入中文

对其他系统用户这大概都不是什么问题,但是在BSD系统上有一堆问题……

环境:FreeBSD 11, 打了个patch所以用的centos 6作为linux_base。

首先是glibc是否支持locale的问题。貌似linux_base-c6没有产生locale数据库,所以要跑build-locale-archive。
之后跑linux的locale应该就不会报错了。

其次看gtk的xim输入法模块是否启用了。找个gtk2-devel的包,从里面可以找到gtk-demo,跑他可以检验。
默认貌似只装了gtk2包,没装immodule…… 找到gtk2-immodules-xim包,把里面的im-xim.so装到/compat/linux/usr/lib/gtk-2.0/2.10.0/immodules里。这还没完,还要更新immodules列表。跑linux的gtk-query-immodules-2.0,把结果写到/compat/linux/etc/gtk-2.0/i386-redhat-linux-gnu/gtk.immodules里。之后开gtk-demo,找个文本框,右键菜单->输入法里应该有XIM了。

这时可能还是无法激活输入法。我写了个小程序检查XIM的情况:

#include <X11/Xlib.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main() {
        Display *dpy = XOpenDisplay(NULL);
        if (!dpy) {
                printf("fail to open display\n");
                exit(1);
        }
        if (XSupportsLocale()) {
                printf("Xlib supports current locale\n");
        }
        char *p = XSetLocaleModifiers("");
        printf("current locale modifier: %s\n", p);
        XIM im = XOpenIM(dpy, NULL, NULL, NULL);
        if (!im) {
                printf("fail to open im\n");
                exit(2);
        }
        printf("locale of IM: %s\n", XLocaleOfIM(im));
}

如果没有显示Xlib supports current locale,那linux的libX11不支持现在的locale…… 我发现X11的locale没装,找到libX11-common包,把里面的东西解压到/compat/linux里。之后再跑就没问题了……

这些都搞完之后,gtk-demo就可以输入中文了。重启浏览器,Flash终于也可以了……