QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 779|回复: 3

Linux下输入法启动的分析 [转]

[复制链接]
发表于 2005-1-6 20:06:32 | 显示全部楼层 |阅读模式
新近在sir上面看到一篇文章

是关于linux下面输入法启动分析的我觉得很经典的是启动分析那一段

就把他贴到公社有感兴趣的看一看吧。

ps:如果你打算转载请注明原作者,尊重别人的劳动果实,谢谢   

Linux下输入法启动的分析

作者:qhgary

3. 输入法是何时被系统调用的?
很多人不知道输入法到底什么时候被load进来,不知道这个当然就不知道为什么有的时候呼不出输入法(因为可能根本没有调入)当然也不会知道如何配置能够符合自己的要求。
大家都知道,linux下面比较常用的有两个桌面系统,gnome和kde,这都无所谓,他们其实都是架在X系统之上的。简单的说X系统就是一个最核心,也是最底层的桌面系统,gnome也好,kde也罢,或者其他的什么fvwm之类的,都只不过是X系统和用户之间的另一层软件而已。所以要想达到不管使用什么桌面系统,都能调入输入法,就是要在X系统启动的时候,让输入法也启动起来,那么这样之后,无论你使用的是gnome还是kde或者其他什么桌面,都能够调入输入法。因为当轮到他们启动的时候,X系统已经启动好了,输入法已经被系统调入了。那么X系统又是如何启动的呢?让我们从startx开始说起。
无论你用什么桌面系统,都是通过startx启动的,那么startx究竟是什么呢?一个应用程序还是一个脚本文件?为什么它能够启动各种桌面系统,并且能够按照相应的配置文件来设置呢?带着疑问,我在console里面输入whereis startx.
在找到了存放startx的路径以后,用编辑器打开它发现原来是一个脚本文件。这个脚本文件的内容可能根据发行版不同,会有差异,如果你懂一些shell 的语言,那么你可以尝试看看,不一定要全部看懂,但是你大致看过以后会发现最后有一个xinit的命令,然后跟着一些参数。我尝试在console下面输入xinit(注意,不要在图形界面下做此操作)
发现图形界面启动拉,但是很丑陋,什么功能都没有,鼠标可以动,还有一个可以输入命令的小窗口。怎么退出来?ctrl+alt+backspace. 原来如此,startx只是一个脚本,里面通过对一系列配置文件的分析设置,最终利用xinit命令启动图形界面。不管是kde还是gnome,都是在这个脚本中完成的。那么让我们再打开startx脚本看看里面还做了些什么。你仔细看看,会发现有一个东西很显眼,就是 /etc/X11/xinit/xinitrc,这个xinitrc好像很眼熟,在配置输入法的其他贴中总是看到,这里出现了肯定是里面运行了这个脚本。再看其他的一些东西,其实都是利用shell配置出一个xinit启动的参数,用来配置桌面系统用的,不用管它。目前已知的就是startx的时候它会去执行一个/etc/X11/xinit/xinitrc的脚本,让我们打开来看看里面有什么。
打开一看,其中一段我觉得最有价值,是一个for循环,他依次执行了/etc/X11/xinit/xinitrc.d/下面的所有脚本。你可以耐心的找一下,一定可以发现。那么这个目录里面有些什么内容呢?有一个文件看名字就知道和输入相关,他叫xinput。等等,让我们理一下,是怎么从startx 到xinput的。
首先是执行startx这个脚本文件,里面他会执行xinitrc这个脚本,然后xinitrc脚本里面有一个循环,依次执行了xinitrc.d/下面的所有脚本,其中有一个是和输入法相关的,叫xinput。OK, 我们继续,打开xinput看看。

这个文件里面的内容可能根据使用的版本不同会不一样,所以我很难描述,如果是RH9你会发现这个文件会去执行/etc/sysconfig/i18n,然后根据现有的环境变量,比如大家熟悉的LC_CTYPE来分别设置对应的XIM, XIM_PROGRAM, XMODIFIERS等。这3个环境变量的设置直接涉及到你使用的输入法。不管你用scim还是fcitx都会在他们的文档里面发现如何设置这3个变量,有的说在这个文件里面改,有的说在那个文件里面加,弄得人晕头转向,现在想想就简单了,无论对哪个文件修改,都只是为了设置他们。如果你是FC3,可能 xinput里面内容不多,但是有一个for循环,去依次执行另外一个目录下面的脚本,那么你可以尝试去看看这个目录,以及对应的文件。我们的目的很明确,就是要在这个脚本执行完以后设置好XIM, XIM_PROGRAM, XMODIFIERS,这样你就可以使用输入法了。往往看到人问为什么呼不出输入法,问题就在这里,简单点说就是xinput执行完了以后并没有设置好这 3个环境变量。
如果你知道怎么修改shell脚本,那么你可以加入适当的代码让它执行完后设置好这3个变量,比如我用的是scim。那么我让xinput执行完以后,环境变量变成:
LC_CTYPE=”en_US.UTF-8”
XIM=”SCIM”
XIM_PROGRAM=scim
XIM_ARGS=”-d”
在xinput的最后,会利用上面的这几个变量来启动对应的输入法。设置LC_CTYPE=”en_US.UTF8”会让我用英文系统,下面设置好XIM 相关的变量,能够让我使用中文输入法。如果你实在不知道如何修改脚本,你就把上面的设置放在xinput文件的最开始,脚本里面的代码会判断该变量是否设置过,如果设置过了就不会修改。所以你必须放到最前方,不要放到脚本末尾,那样就没有意义了。
设置好以后,你可以在console下面执行这个脚本看看,. xinput(注意前面有一个点哦,然后一个空格,然后才是xinput)如果没有报错,那么你通过echo $XIM类似的方法查看上面的变量是否设置正确。如果没有问题,那么就startx启动看看能不能使用输入法。
应该就这么多,如果你发现有些地方可以输入中文,有些地方还是输入不了,那么你要去看看该输入法的文档,比如scim,你可能还需要执行gtk-query-immodules-2.0 > /etc/gtk-2.0/gtk.immodules使其能够在gtk-2.0的程序中使用等等。剩下的就靠你自己去探索学习拉。
发表于 2005-1-6 20:23:58 | 显示全部楼层
不错呀!好东东!
回复

使用道具 举报

发表于 2005-1-6 20:38:04 | 显示全部楼层
这个公社有了,只不过在另一个版.
回复

使用道具 举报

 楼主| 发表于 2005-1-6 22:01:03 | 显示全部楼层
哦,我只是觉得他的思路很好!

顺藤摸瓜!!   

所以贴出来了!
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-13 00:20 , Processed in 0.064762 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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