imsettings on n900 剖析

我提交到maemo上去的im-chooser有问题,刚有个日本人问我怎么用不了。http://maemo.org/packages/package\_instance/view/fremantle\_extras-devel\_free\_armel/im-chooser/1.3.2-1/
然后找这个问题的答案我花了有3个小时。
首先,在我手机上的现象是,打开im-chooser,列表是空的,没有任何可以选。然后我去查im-chooser的代码,发现原因是cur_iter==NULL,就是说它不知道当前用的是什么输入法,于是它就不显示任何输入法。
它不知道当前用的是什么输入法在于imsettings_info_is_system_default对于任何输入始终返回false。而 cur_iter==NULL的真正原因是那个while循环中strcmp(running_im, name)始终都不等于0.说来说去就是,我当前所用的im,它没在它的im模块列表中找到。看来这还是imsetting没挪对。因为我在手机上运行imsettings-info其结果是任何项目前面都没有星号。找了许久,看起来是imsettings_request_whats_input_method_running这个函数的问题。
为了方便于调试imsettings,我去找它的dbus接口说明。http://code.google.com/p/imsettings/wiki/DBusInterfaces。可是它没有说dest以及destination object path应该填什么。于是我就打开dbus-monitor,看了一下输出,然后照抄过去。
dbus-send --print-reply --dest=com.redhat.imsettings /com/redhat/imsettings com.redhat.imsettings.WhatsInputMethodRunning,在我电脑的fedora上运行返回是ibus,但是在我手机上返回的是空字符串。
然后找到大概是因为ibus的daemon不是由imsettings启动的所以imsettings不知道ibus的pid,所以在 imsettings_manager_real_whats_im_running中用_get_pid_from_name根据im name找不到对应的module。有趣的是imsettings在启动ibus的时候却说Main Input Method process for ibus died with the status 255, but unexpectedly. restarting...呃……其实原因也很简单,因为ibus进程已经启动了。所以如果要用imsettings框架,那么一定要禁止用户手动启动ibus。否则得像我今天一样,花了3个小时读代码才发现,哦,原来如此。
通常情况下,Xorg启动的时候会执行/etc/X11/xinit/xinitrc以及~/.xinitrc这两个脚本。而fedora下,/etc/X11/xinit/xinitrc去执行/etc/X11/xinit/xinitrc.d下的脚本,其中有一个xinput.sh,它会设置GTK_IM_MODULE/QT_IM_MODULE/XMODIFIERS这几个环境变量的初始值。然后通过imsettings-start脚本启动/usr/libexec/im-settings-daemon。但是n900貌似没有xinit。
当imsettings切换输入法的时候,它把请求发给它的backend。
目前有4种backend,GConf、Qt、LXDE、XIM,分别在com.redhat.imsettings.GConf com.redhat.imsettings.Qt com.redhat.imsettings.LXDE com.redhat.imsettings.XIM上监听。GConf这个backend主要是修改gconf中/desktop/gnome/interface/gtk-im-module的值,而gnome-settings-daemon会监听这个值的改变。后续的东西我就不了解了。
而xim的backend貌似是架一个代理,它在dbus上监听ChangeTo消息,然后把这个转发给XIM server(此处用的是libgxim库)。但是由于我对XIM很不熟悉,所以不了解具体怎么回事。
反正事情还没完。目前im-chooser在n900上可以用来启动输入法,但是它没有帮助设置环境变量。所以切换的功能还是不好使。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥