X window system记录 (by hanlray@gmail.com)
startx & xinit
startx调用xinit,xinit启动X server和第一个X client,当这个X client退出时,xinit杀死X server然后终止。 若直接使用xinit来启动X,如果没有在命令行指定要启动的X client,xinit会在用户的home目录下寻找名为.xinitrc的文件并作为shell script来运行;若使用startx来启动则当用户home目录下没有.xinitrc时会使用/etc/X11/xinit/xinitrc作为client的启动script. 怎么启动X server呢?你必须告诉它X server program的位置及相应的启动参数,遵循Linux程序的一般约定,你可以在命令行、用户目录下的.xserverrc和系统的xserverrc(一般在/etc/X11/xinit)里指定,当在xserverrc里指定时,形式类似: exec /usr/bin/X11/X -dpi 100 -nolisten tcp
resource的设定
可以把应用程序的resource设定在server端、host端,或者专门针对要设定的应用程序的resource文件里server端
server端的resource设定在root窗口的RESOURCE_MANAGER属性上,可以直接用xrdb -root来查看和设定,也可以写在~/.Xdefaults文件里,当X session启动时会被用xrdb加载到RESOURCE_MANAGER属性上。host端
如果定义了环境变量XENVIRONMENT,则存在它定义的文件中,否则在~/.Xdefaults-host文件里应用程序特定
应用程序特定的resource文件的名字、位置、及相关规则和使用的toolkit有关,X toolkit和gtk就完全不一样。输入法
要使用输入法,当然必须先启动输入法进程,以scim为例:export XMODIFIERS=@im=SCIM ; export GTK_IM_MODULE="scim" scim -d激活输入法的按键(常用Ctrl-Space)是由输入法设定的,当输入法进程启动时会向X server注册该按键,当X server端捕捉到用户输入该按键后就会通知该输入法进程,输入法收到该事件后发现是激活输入法的事件,于是向X server请求处理以后的键盘事件,使X server就把以后的输入事件先交由输入法处理,从而使输入法进入激活状态。 通常我们希望输入法在X session里自动启动,这对基于debian的系统很容易,只要在$HOME/.xinput.d目录下建一个名为default的symbol link,使之指向/etc/X11/xinit/xinput.d/zh_CN就行了,其机制如下:
- debian风格的X session在启动时会执行/etc/X11/Xsession.d目录下的文件(按字母顺序),其中有一个名为im-switch的文件就是来启动输入法的。
- im-switch首先从当前的locale设定得到一个语言变量LNG,比如LC_CTYPE为en_US.UTF-8时该变量就是en_US,然后按顺序寻找以下文件:
- $HOME/.xinput.d/$LNG
- $HOME/.xinput.d/all_ALL
- /etc/X11/xinit/xinput.d/$LNG
- /etc/X11/xinit/xinput.d/all_ALL
- /etc/X11/xinit/xinput.d/default
最后执行找到的第一个文件。
这里im-switch不仅从用户和系统两个级别考虑了输入法的配置,还考虑了相应的locale,还是很灵活的。