显示标签为“X”的博文。显示所有博文
显示标签为“X”的博文。显示所有博文

2009年2月22日星期日

xserver-xephyr

Xephyr 是一个 Xnest 的替代产品,因为 Xnest 不提供现代 X server 的一些高级特性,比如图形加速的支持。简而言之,Xephyr 是一个 X server,但是它执行在一个存在的 X server 里面,这个可以用来做很多事情,比如需要通过 XDMCP 连接到另外一台主机,那么不需要另外打开一个新的 X server;又比如正在写一个 window manager,那么在一个 X server 里面打开的 X server 里面调试,将会比直接在现有的 X server 里面替换现有的 window manager 方便很多。对于热衷于更换自己的 window manager 的狂热爱好者,Xephyr 提供了绝佳的试验环境。

x.org 的 Xephyr 带有下面的东西,
/usr/share/doc/xserver-xephyr/README
/usr/share/doc/xserver-xephyr/copyright
/usr/share/doc/xserver-xephyr/changelog.gz
/usr/share/doc/xserver-xephyr/changelog.Debian.gz
/usr/bin/Xephyr
我们可以直接运行 -help 获得帮助,基本的使用方式是 Xephyr :n -options。这里 :n 是 DISPLAY 的值,Xephyr 本身是一个 X client,也是一个 X server,它是 client 通过环境变量 DISPLAY 设置显示的 X server,这里的 :n 指定的是它作为 X server 的序号,也就是说 X client 可以通过 -display 或者更改环境变量。我们这里简单介绍一些其他的参数,如 -query 和 -indirect 可以用来向打开了 XDMCP 的主机发送连接请求,-screen 指定屏幕大小,-fullscreen 全屏。

比如我们想玩玩 aewm,就可以
$ Xephyr :1 -screen 800x600
$ export DISPLAY=:1.0
$ aewm &

2008年7月15日星期二

x11-utils

该包内含有:
/usr/share/doc/x11-utils/copyright
/usr/share/doc/x11-utils/changelog.gz
/usr/share/man/man1/listres.1.gz
/usr/share/man/man1/luit.1.gz
/usr/share/man/man1/viewres.1.gz
/usr/share/man/man1/xdpyinfo.1.gz
/usr/share/man/man1/xdriinfo.1.gz
/usr/share/man/man1/xev.1.gz
/usr/share/man/man1/xfd.1.gz
/usr/share/man/man1/xfontsel.1.gz
/usr/share/man/man1/xkill.1.gz
/usr/share/man/man1/xlsclients.1.gz
/usr/share/man/man1/xlsfonts.1.gz
/usr/share/man/man1/xmessage.1.gz
/usr/share/man/man1/xprop.1.gz
/usr/share/man/man1/xvinfo.1.gz
/usr/share/man/man1/appres.1.gz
/usr/share/man/man1/editres.1.gz
/usr/share/man/man1/xlsatoms.1.gz
/usr/share/man/man1/xwininfo.1.gz
/usr/share/menu/x11-utils
/usr/bin/appres
/usr/bin/editres
/usr/bin/listres
/usr/bin/luit
/usr/bin/viewres
/usr/bin/xdpyinfo
/usr/bin/xdriinfo
/usr/bin/xev
/usr/bin/xfd
/usr/bin/xfontsel
/usr/bin/xkill
/usr/bin/xlsatoms
/usr/bin/xlsclients
/usr/bin/xlsfonts
/usr/bin/xmessage
/usr/bin/xprop
/usr/bin/xvinfo
/usr/bin/xwininfo
/etc/X11/app-defaults
/etc/X11/app-defaults/Editres
/etc/X11/app-defaults/Editres-color
/etc/X11/app-defaults/Viewres
/etc/X11/app-defaults/Xfd
/etc/X11/app-defaults/XFontSel
/etc/X11/app-defaults/Xmessage
/etc/X11/app-defaults/Xmessage-color
下面逐一介绍,
  • appres、editres、listres 和 viewres 是处理 X resource 的工具,appres 可以显示某一个程序或者子项目的相关 resource,listres 显示所有 widget 的 resource,editres 和 viewres 是显示 resource 的 GUI。
  • luit 被设计为任意程序与一个 utf-8 虚拟终端交互的 filter,已经不大用了,现在鼓励直接让程序生成 utf-8。
  • xdpyinfo 显示 X server 的信息,如使用了什么 extensions,分辨率之类的。
  • xdriinfo 显示 DRI 信息,不知道为啥 NVIDIA 的显卡上面都说 libGL 太老了 @@...
  • xev 可以为指定的窗口(-id)或者创建一个新窗口显示对应接受的 events,多用于调试 GUI。
  • xfd 显示某一个字体所有字符,可用 -fn 指定(X core font)字体名或者 -fa 指定 Xft 字体名。
  • xfontsel 是一个显示各个字体样例的程序。
  • xkill 是杀掉 X clients 的一个程序,需要用 -id 指定 resource,或者不指定会让用户用鼠标点击。
  • xlsatoms 列出 X server 端 atom,似乎跟 X server 有关系,但是不知道是些啥 -,-b
  • xlsclients 列出连在某个 X server 上的 X clients。
  • xlsfonts 列出所有 X core fonts。
  • xmessage 设计的目的和 echo 类似,显示在屏幕上一个窗口,可以自定义文字,按钮和返回值。
  • xprop 显示或更改指定 X client 的 X server 属性。
  • xvinfo 显示 X-video extension 的信息。
  • xwininfo 显示对应 window 的信息。

这里就一些细节进一步讨论。

2008年7月7日星期一

x11-xserver-utils

这是一组 X 里有用的命令集合,比较底层,包括
/usr/share/doc/x11-xserver-utils/copyright
/usr/share/doc/x11-xserver-utils/changelog.gz
/usr/share/man/man1/sessreg.1.gz
/usr/share/man/man1/showrgb.1.gz
/usr/share/man/man1/xcmsdb.1.gz
/usr/share/man/man1/xhost.1.gz
/usr/share/man/man1/xmodmap.1.gz
/usr/share/man/man1/xrandr.1.gz
/usr/share/man/man1/xrdb.1.gz
/usr/share/man/man1/xset.1.gz
/usr/share/man/man1/xsetmode.1.gz
/usr/share/man/man1/xsetpointer.1.gz
/usr/share/man/man1/xsetroot.1.gz
/usr/share/man/man1/xstdcmap.1.gz
/usr/share/man/man1/xtrap.1.gz
/usr/share/man/man1/xtrapin.1.gz
/usr/share/man/man1/xtrapinfo.1.gz
/usr/share/man/man1/xtrapout.1.gz
/usr/share/man/man1/xtrapproto.1.gz
/usr/share/man/man1/xtrapreset.1.gz
/usr/share/man/man1/xtrapstats.1.gz
/usr/share/man/man1/iceauth.1.gz
/usr/share/man/man1/xgamma.1.gz
/usr/share/man/man1/xrefresh.1.gz
/usr/share/man/man1/xtrapchar.1.gz
/usr/share/man/man1/xvidtune.1.gz
/usr/share/menu/x11-xserver-utils
/usr/bin/iceauth
/usr/bin/sessreg
/usr/bin/showrgb
/usr/bin/xcmsdb
/usr/bin/xgamma
/usr/bin/xhost
/usr/bin/xmodmap
/usr/bin/xrandr
/usr/bin/xrdb
/usr/bin/xrefresh
/usr/bin/xset
/usr/bin/xsetmode
/usr/bin/xsetpointer
/usr/bin/xsetroot
/usr/bin/xstdcmap
/usr/bin/xtrapchar
/usr/bin/xtrapin
/usr/bin/xtrapinfo
/usr/bin/xtrapout
/usr/bin/xtrapproto
/usr/bin/xtrapreset
/usr/bin/xtrapstats
/usr/bin/xvidtune
/etc/X11/app-defaults/Xvidtune
我们一个一个来介绍每个命令的用途。如果需要了解 X window 系统结构,可以参看这里。
  • iceauth 和 xauth 类似,但是是作为 inter-client exchange 协议下的认证文件 .ICEauthority 的操纵程序。
  • sessreg 用于记录 X session 的会话记录到 utmp(记录登录登出)。
  • showrgb 显示系统已知颜色对应的 rgb。
  • xcmsdb(X color management system)用于加载、查询 X 的 device profile,如将 CIEXYZ 转换成为 RGB 的方法、gamma 信息。
  • xgamma 用于获得或者更改 X 显示的 gamma 值。
  • xhost 是一种 X server 的验证机制,是基于主机名/地址的,语法为 xhost + 开放给所有人,xhost - 仅仅允许 list 里面的主机,xhost +hostname 添加到 list 而 xhost -hostname 删去。
  • xmodmap 用于显示或者修改键盘或者鼠标映射,如 -pm 显示 modifier(如 Ctrl、Shift 等)、-pk 显示 keymap。可以通过 -e 执行一个命令或者使用一个文件作为命令序列输入。
  • xrandr 是 X 的一个 extention RandR 的命令行接口,用于设定一个 X 的大小、方向(旋转或者镜像)。ms 现在 NVIDIA 的驱动不大支持 xrandr,不爽... 一般用法为 xrandr -q 获得已有的输出设备支持的分辨率和刷新率,然后可以选择设定这些值,并且可以设定屏幕的朝向,如用 --output 屏幕 --reflect x 产生镜像翻转。
  • xrdb 是用于读入 X resource 的工具,X resource 一般存放在 .Xdefaults 里面,放有某些应用程序需要的一些配置,如 Emacs 的字体等等。这个我们会在后面对 X resource 的管理做出专门的讨论。
  • xrefresh 可以用来刷新一个 X screen,或者该 screen 的某一个部位。
  • xset 是一个强大的设置工具,如 b 设置 bell 的声音大小,bc 或者 -bc 设置或者关闭一个 bug compatability 模式,+/-dpms 是 enery star 的功能,fp 可以指定 X server 的 font path(避免修改系统文件 /etc/X11/xorg.conf),led 设定键盘上 LED 指示灯的状态,m 或者 mouse 设定鼠标灵敏程度(加速),r 控制按键自动重复输入(可以选择打开或者关闭对某些键的设置),s 设置 screen saver 的特性,q 显示已有配置。
  • xsetmode 设置输入装置的 mode 为绝对或者相对。
  • xsetpointer 设置 X 主要的 pointer 设备。
  • xsetroot 用于设定 X root window 的性质,如使用光标,使用 bitmap 作为背景,背景色等。
  • xstdcmap 用于设定 X standard color map,不知道有啥用...
  • xtrap* 命令是 X 的 XTrap extension 系列命令,似乎是为了方便 the capturing of server protocol and synthesizing core input events,这是啥 -,-bb
  • xvidtune 用于调整视频模式,如显示偏了,或者大了小了。

这里简单的叙述一下 xmodmap 的用法,keycode 就是按键的编号(数字),keysymname 是按键的符号名称。xmodmap 常用的命令有 keycode NUMBER = KEYSYMNAME 将某个 keycode 映射成为某 keysym。注意 KEYSYMNAME 可以有 8 项表示在有没有 modifier 情况下的结果,如 -pk 的输出
     10     0x0031 (1) 0x0021 (exclam)
11 0x0032 (2) 0x0040 (at)
12 0x0033 (3) 0x0023 (numbersign)
可见按键 1、2、3 是如何被映射的。keycode any = KEYSYMNAME 将未进行映射的 keycode 映射。keysym KEYSYMNAME = KEYSYMNAME 将 keysym 映射成为 keysym,比如要按下 A 出来 B,可以写 keysym a = b,注意中间的空格是不能省略的。clear MODIFIERNAME 清除掉某个 modifier,add MODIFIERNAME = KEYSYMNAME 添加一个 modifier,remove MODIFIERNAME = KEYSYMNAME 去掉一个 modifier,pointer = NUMBER 可以设置三个按键的作用,使用 pointer = default 恢复默认值。


注:
  • 为了不影响现有 X 的正常配置,进行某些实验时,建议另外打开一个 X,如 startx -- :1。

xauth

xauth 是一个很有意思的程序,也许平时不会直接用到,但是很多程序会默默的使用它为你工作,比如前面的 ssh。

提到 xauth 就不可避免的涉及到 X 的工作原理,这里仅仅讨论认证部分。比较傻瓜且很不安全的方式就是用 xhost,比较聪明的方式还是用 xauth。这里讨论后者,在后面提到前者的时候我们会将它们比较。xauth 认证靠一串 128bit 的数字,所谓的 magic cookie,正式名称为 MIT-MAGIC-COOKIE-1。这串数字由 X server 产生,一般一个 X client 需要访问 X server 根据 -display 或者 DISPLAY 变量给出的地址,查询本地 XAUTHORITY 文件(一般是 ~/.Xauthority)获得对应 magic cookie,这样才会被授权访问 X server。在 X11R6.3 以后还加入了一个新特性,就是 X11 服务器可以 on-the-fly 生成 magic cookie,并标注某些 trusted,某些为 untrusted,这样给不同的 Xclient 以不同的 cookie,就可以防止某些 X client 程序盗取键盘按键序列等敏感信息。

一般来说 X server 启动的时候会产生 magic cookie,我们只需要将合适的 cookie 分发到需要调用 X clients 的主机上,那些主机的 X clients 就可以出现在 X server 上了。比较常用的 magic cookie 的生成程序来自于 mcookie。

xauth 就是用来操纵 XAUTHORITY 文件的程序,使用它会方便分发 magic cookie。一方面可以直接用 xauth command 来执行相关的命令,另一方面也可以在命令行上通过 xauth 进入交互环境。命令不多,有 n 开头和非 n 开头的命令,n 表示输出用数字,在某些情况更加合适一些,如某些传输情况。由于 XAUTHORITY 文件访问可能被锁定,所以有 -b 选项尝试解锁,-i 选项忽视锁。下面是常用命令,
  • add displayname protocolname hexkey:添加一个 display 和对应的 magic key,中间的 protocolname 可以用 . 表示 magic cookie。
  • generate displayname protocolname [trusted|untrusted]:和 add 不同在于是自动连接 X server 获得 magic cookie。
  • [n]extract filename displayname:把指定 displayname 的 magic cookie 写入指定文件,如果文件名为 - 则是标准输出。
  • [n]list [displayname...]:显示 XAUTHORITY 里面的 magic cookies。
  • [n]merge [filename...]:把 filename 和现在的融合在一起。
  • remove displayname:删除某项。
  • source filename:执行 xauth 命令序列
  • info:显示相关信息
  • exit:保存并退出。
  • quit:不保存但退出。

我们可以分析一下 ssh 如何实现 X11 forwarding,首先设置 DISPLAY 变量,并将其关联到自己的 tunnel,然后需要把远程主机 XAUTHORITY 更改:
if read proto cookie && [ -n "$DISPLAY" ]; then
if [ ‘echo $DISPLAY | cut -c1-10‘ = ’localhost:’ ]; then
# X11UseLocalhost=yes
echo add unix:‘echo $DISPLAY |
cut -c11-‘ $proto $cookie
else
# X11UseLocalhost=no
echo add $DISPLAY $proto $cookie
fi | xauth -q -
fi
可见,如果是 localhost 开始(已经使用了 ssh)取 localhost: 后面的数字前面加上 unix:,否则直接使用。这个符合语句通过 echo 把命令显示并由管道输入给 xauth。有些不使用 ssh 的环境,如 telnet 或者 rsh,同时 home 又不公用,就需要一边 xauth list 一边 xauth merge 了。

相关程序:
xhost 来自于 x11-server-utils。
mcookie 来自于 util-linux。

2008年6月7日星期六

Debian 字体配置初步认识

在 Linux 世界里,字体的处理不如 Windows 里面那么统一,历史上流传下来的一些方法,还有后面加入改进的方法,Debian 自己还有一个 defoma。总而言之,如果稍微糊涂一点,基本上最后配置不清楚。这里称为初步认识,也就是了解一个大致的机理,一些更为高级的用法,我们会在后面的讨论中涉及。

传统的 X 程序,都是利用所谓的 X core fonts 来做事情的,这些例子有 GNU Emacs、xterm 还有 gtk1 的程序,如 xmms。X 管理 core fonts 使用的基本技术是在配置文件的 Files 段设置的 FontPath。我们一般会把自己的字体放在特定的目录里面,经过处理,这个目录就能成为 FontPath 需要的目录。让 X 知晓这些目录可以修改 xorg.conf,也可以在运行的 X 里面用 xset 命令(或者 xset -display 指定 X)。如
xset fp+ /usr/local/share/fonts/truetype/chinese,/usr/local/share/fonts/truetype/windows
那么如何建立合适的目录呢,你只需要到上述目录中 mkfontdir 即可,对于矢量字体如 true type 的,在此之前需要 mkfontscale。我们可以通过 xset q 检查 FontPath,之后可以用 xlsfonts 获得 X core fonts 的列表。

另外一种就是依靠 fontconfig,这个也更加简单,如果你完成了上述的 mkfontdir 步骤,就可以直接 fc-cache -fv 更新字体的 cache,这一般在 /usr/share/fonts、/usr/local/share/fonts 和 ~/.fonts,然后可以用 fc-list 获得列表。现在多数程序,如 gtk2、qt 的程序都是利用 fontconfig 提供的字体,还有 xetex,呵呵。

那么 defoma 是用来做什么的呢?它主要提供了一个集中的管理模式,一方面可以为 X 提供 core fonts,通过在 /var/lib/defoma/ 里面提供了一个统一的字体目录(里面是字体的符号连接,这样就只需要在这一个目录里面 mkfontdir 即可,并且 defoma 会帮你完成),也为 fontconfig 提供字体。那么 defoma 是如何知晓字体信息的呢?Debian 自己有很多 ttf 安装程序,它们都带有一个 hints 文件放在 /etc/defoma/hints 内,因此,如果我们需要安装新的字体,那么就需要为它们创建对应的 hints,本来 defoma 的确提供了这样一个脚本 defoma-hints,但是在写这篇短文的时候却不可用,原因是它所依赖的库 libft-perl 已经很长时间没有人维护了,而 perl 已经升级到 5.10 而不是原先的 5.8 版本了,因此我们迫切需要有人用 5.10 里面处理 free type 的库重写 defoma 的很多脚本。

让我们期待这天的早日到来!