snow_insky 发表于 2005-5-2 15:06:02

功成之后的贡献-Xserver启动过程解析

半年前跳槽,然后就一直在Linux下工作,由于才开始使用Linux,所以遇到问题就会在google和各大网站上搜索解决方法,在这期间遇到了许许多多很好的文章,也遇到了很多高手,所以一直以来也好想给大家拿些东西回报这个社区,今天累了,所以就稍微写点东西给大家,以免有人还走我走过的弯路。

省略了很多不必要的细节,所以看的时候可能会和其他文章有不太一样的地方;也希望大家指出我对该过程理解有误的地方。


——Xserver启动过程(主要讲解在SUSE-KDE下,输入法的选择过程)
1.startx:启动XSERVER和Xclient

2.startx:运行xinitrc(如果在用户目录下有.xinitrc则运行之,否则运行位于/etc/X11/xinit/xinitrc)
在其中你可以看见
# Start the XIM server
XIMFILE=/etc/X11/xim
test -r $HOME/.xim   && XIMFILE=$HOME/.xim
test -r $XIMFILE && source $XIMFILE

这里是执行输入法的选择脚本,脚本叫做xim(如果在用户目录下有.xim则执行它,否则执行/etc/X11/xim);

在xim中是这样执行选择过程的
if [ "$INPUT_METHOD" == "" ] ; then
    source /etc/sysconfig/language
fi

if [ "$INPUT_METHOD" != "" ]; then
    echo "INPUT_METHOD is set to $INPUT_METHOD."
    echo "Tryingto start this user selected input method first ..."
    if [ -r "/etc/X11/xim.d/$INPUT_METHOD" ] ; then
      echo "sourcing /etc/X11/xim.d/$INPUT_METHOD"
        source /etc/X11/xim.d/$INPUT_METHOD
      if [ "$?" == "0" ]; then
          echo "Start of $INPUT_METHOD succeeded."
          return 0;
        else
          echo "Start of $INPUT_METHOD failed."
        fi
    else
      echo "/etc/X11/xim.d/$INPUT_METHOD does not exist."
    fi
else
    echo "INPUT_METHOD is not set or empty (no user selected input method)."
fi

首先查看INPUT_METHOD变量是否被设置(这个变量的设置可以在.bashrc或.bash_profile执行),如果该变量为空则执行source /etc/sysconfig/language,该脚本选择一个系统目前使用的语言,并设置基本的语言变量(如INSTALLED_LANGUAGES,ROOT_USES_LANG,RC_LC_PAPER),这些我们不需要理,只要设置了LC_CTYPE="zh_CN.gbk"和LC_ALL=zh_CN.gbk(在.bashrc或.bash_profile设置)就可以了,并且这个脚本中source /etc/X11/xim.d/$INPUT_METHOD还可以设置系统级的INPUT_METHOD,我们不在这里设置,而改在.bashrc或.bash_profile中设置,因为许多情况下我们是不可以编辑该文件的。

如果INPUT_METHOD被设置了,就去执/etc/X11/xim.d/$INPUT_METHOD脚本,该脚本就是启动相关输入法,并设置相关变量。

比如我在.bash_profile设置export INPUT_METHOD=fcitx,就去执行/etc/X11/xim.d/fcitx,但是该目录下并没有fcitx 脚本,因为fcitx安装时并不生成该文件(o,how should I do?),莫急,简单,拷贝该目录下的一个脚本文件并命名为fcitx(比如cp scim fcitx),然后修改该脚本,我的脚本如下:
OLD_PATH=$PATH
PATH=/usr/bin:$PATH

if ! type -p fcitx > /dev/null 2>&1 ; then
    echo "fcitx is not available."
    return 1
fi

export XMODIFIERS="@im=fcitx"
#export GTK_IM_MODULE=fcitx
#export QT_IM_SWITCHER=imsw-multi
#export QT_IM_MODULE=fcitx
export XIM=fcitx
export XIM_PROGRAM=fcitx

fcitx &

PATH=$OLD_PATH

# success:
return 0

好了,这样就OK了,restart Xserver,我们就可以使用fcitx输入法了。

其它的输入法也可以用同样的方法设置。

我把

#export GTK_IM_MODULE=fcitx
#export QT_IM_SWITCHER=imsw-multi
#export QT_IM_MODULE=fcitx
这三行注掉了,因为加上它们,fcitx不响应ctrl_space!

不知是怎么回事,希望有高手可以告诉我,我知道这三行是用于设置GTK,QT程序的输入法。

说明:
在linux下共存在三种图形界面框架——GTK,GTK2,QT,所以我们要分别为这三种应用程序设置输入法。KDE就是基于QT的一个XClient程序.

好了,真累,有时间再补充!

duotaiya 发表于 2005-5-2 18:06:28

请教一个问题
用xinit启动的x同用startx启动的x有什么不同

fudaming 发表于 2005-5-2 18:22:47

export GTK_IM_MODULE=xim

snow_insky 发表于 2005-5-2 23:48:55

请教一个问题
用xinit启动的x同用startx启动的x有什么不同

整个图形界面的启动是由startx这个脚步进行的,而xinitrc这个教本只是其中的一步而已。

cnhnln 发表于 2005-5-3 00:11:15

startx应该是还启动了窗口管理器或桌面环境

duotaiya 发表于 2005-5-3 13:11:27

startx应该是还启动了窗口管理器或桌面环境
窗口管理器或者桌面环境可以在.xinitrc这个配置文件里设定
用xinit命令就可以启动图形界面
我想知道startx是否还有其他的配置文件

snow_insky 发表于 2005-5-4 13:45:12

你自己去看一下startx这个脚本就知道了,还有哪些需要运行的脚步
页: [1]
查看完整版本: 功成之后的贡献-Xserver启动过程解析