X Window 系统使用指南--键盘和滑鼠--对应和参数


第18章 键盘和滑鼠 -- 对应和参数
在前章我们看到了Toolkit 所提供的转译结构 , 它让你对一个应用程式的个别
成员 , 定制你的键盘和滑鼠 。在本章 , 我们来看另一种较低层次的定制 , 它是
由server所管理 , 称之为对应(mapping) , 你只需要告诉server你的键盘所需
的不同的配置 , 它就会被每一个连接到你server上的应用程式应用到 。例如:
取代通常的QWERTY键盘 , 你可能希望重新安排键盘以适应那些对键盘并不熟悉
的使用者 (你可能把键盘按ABCDEF... 重新排过 , 当然键盘按钮上所印的字也
需更改成相符) 。你也能对一些Control , Shift等等的修饰键作指定 。对滑鼠
按钮 , 一样有一个相关的对应 , 可将 "逻辑的" 按钮对应到实际动作 。整体而
言 , 你使用这些键盘和滑鼠的对应的频率 , 将小於转译 。
此外 , 尚有非常常用的第三种型态的定制可用:你可以设定有关你键盘和
滑鼠各种不同的参数 。例如响铃声音的大小 , 按下键时是否有滴答声等等 。在本章 , 我们先描述键盘、滑鼠和修饰键的对应 , 接下来描述你如何使用
xset程式 , 来定义类似像键盘有无滴答声的参数设定 。18.1 键盘和滑鼠对应 -- xmodmapserver本身处理一个层次的定制 , 它对於所有使用到此server或显示器的应用程
式均发生效用:这就是键盘对应 (keyboard mapping) 。每一个键 , 有一个单独的码对应它 , 称之为键码(keycode) 。键和键码之间
的关系是绝对固定的 。(粗略来说 , 你可以说 "键码就是键") 。连接到每一个键码 (或键)的是一个keysym的表列 。一个keysym是一个代表
印在键盘符号上的数字常数 。在预设的情况 , 大多数的键只有一个keysym 与之
对应 , 例如 SHIFT , A , B , Delete , Linefeed等等 。keysym既非ASCII或EBCDIC
字元 , 也非server用以维持keysym和字元的关系 。你可以对每一个键有两个
keysym 。在预设对应中 , 有很多连接到两个keysym的键 , 例如冒号(:) 和分号(;)
, 7 和 &等等 。对一个键附属的keysym表列中 , 第一个keysym是未按下修饰键
的状况下的键 。第二个keysym是指当SHIFT (或Lock)已被同时按下时的键 , 如
果在表列中只有一项 , 且为字母 , 则系统自动假设第二项为相对的大写字母 。
超过两项的keysym并没有特别的意义 , 键盘和keysym之间的关系被称之为键盘
对应 。尽量地以server处理一般的键和keysyms。它对键码没有附属意义 , 且它
自己本身不会使用对应从键码对应至keysyms :它只是传递资讯给clIEnt应用
程式 。特别的是 , server对ASCII 或其它的字元集合 (character sets) 毫无
概念;它只是说明 "某键被按下 , 某修饰键也同时被按下 , keysym表列中某
keysym和某键相关"。它是client (典型的使用标准的X Library) 对keysym
和修饰键附属的意义:例如 , 它决定如果keysym产生时ctrl也被按下 , 它必需
被解释为ASCII 字元 hex 0x1 , 也就是说ctl-A 。特定的client可以决定特殊
的修饰键的意义;例如在xterm 中 , 当你和MTEA键同时按下一个键 , 程式将此
转换为ESC 後面跟随著被按下的字元 。(也就是说 , 如果你按下meta-A , 实际
上会产生两个字元 ASCII 0x1b, ASCII 0x41) 。server在此领域内提供一个额外的设施 。你可以定义让server将键码解释
成修饰键 , 例如 "当键码为若干的键被按下时 , 它相同於CONTROL修饰键被实际
按下" 。这种定义并不互斥:如果你定义键F7为Shift 修饰键 , 它并不会影响任
何现存的修饰键 。此种设施称之为修饰键对应 (modifier mapping) 。X提供八
个修饰键:Shift、Lock(caps-lock)、Control、Mod1到Mod5 。习惯上 , Mod1被
解释为Meta 。最後 , 对滑鼠按钮有一个类似的指标对应 (pointer mapping) 。对每一个
实际的按钮 , 你可以对它们指定一个相关的逻辑按钮数字 。实际上 , 如果你改变你的键盘或滑鼠的对应 , 你相当於是说制造厂商对你
的输入装置配置不当 , 你将把它修正为适合你所需要的 。当然 , 如果你改变了
对应 , 你应该把对应键上面所印的符号也随之修改;不过 , 通常更改的都是一
些控制和修饰键 , 所以就不是那麽需要了 。换句话说 , 如果你改变了对应 , 使
得键盘配置和一个特定国家标准 (例如:法国或德国) 相符 , 你必需更换实际
键盘上的符号 。你可以预期得到 , 改变键盘对应是一件相当稀罕的事 , 你可能设定它一次
之後就不再改变它 。在以下几节 , 我们将很快的看一看如何使用程式xmodmap
, 查看现有的对应和修改它们 。18.1.1 查看现有的对应你使用xmodmap 来列出现有的对应 , 就如同改变它们一样 。你可以指定不同的
命令列选项 , 来选择想要印出的不同的对应:列出现有键的对应:指定 -pk选项 。列出现有修饰键的对应:指定 -pm选项 (或是什麽选项也不选 , 因为这是
xmodmap的预设作用) 。列出现有指标 (按钮)的对应:指定 -pp选项 。例如 , 将所有的对应一起印出 , 使用命令:xmodmap -pm -pk -pp列出键、修饰键、指标的对应之□例如图18 - 1 , 18 - 2 , 18 - 3 。(键对应只
有列出一部份 , 因为完整的对应实在太长了 。)┌————————————————————┐
│ p228 fig 18.1 │
│ │
│ 图18-1 列出键盘对应的□例 │
└————————————————————┘┌————————————————————┐
│ p229 fig 18.2 │
│ │
│ 图18-2 列出修饰键对应的□例 │
└————————————————————┘┌————————————————————┐
│ p229 fig 18.3 │
│ │
│ 图18-3 列出指标对应的□例 │
└————————————————————┘18.1.2 执行 xmodmap 改变对应 -- 一般性选项当xmodmap 用来改变或设定对应 , 它可以处理一或多个表式 (expression) 的
作用 。你可以把这些输入在一个档案中 , 假设此档案名称叫myfile , 可用下列
命令两者之一:xmodmap myfile
xmodmap - 键的对应)。除了在档案中输入规格之外 , 你也可以在命令列中用 -e 选项直
接指定它们:xmodmap -e expression
xmodmap -e expression-1 -e expression-2为了得到更多有关xmodmap 作用的资讯 , 可以指定冗赘 (verbose)选项 , -v 或
-verbose 。你可以藉著使用 -n 选项不实际的改变对应而获得相同的列印输出
(printout)。(此功能和Unix中make命令的 -n 选项相同 , 其意为 "假装执
行我要求你做的事 , 正确的告诉我你将如何进行 , 但并不实际地完成作用") 。
这个选项对新手或不确定自己是否做的正确的情况非常有用 。每一个表式的语法并不相同 , 但一般性的格式为:keyWord target = value(s)(等号的两边均需为空白) 。18.1.3 改变指标对应指标对应是一个逻辑按钮数字的表列 。(逻辑的button-1我们称为LEFT , 逻辑
的 button-2 称为MIDDLE等等 , 实际的 button-1 是滑鼠左边的按钮 , button-2
是隔壁的按钮等等 , 所以预设的逻辑的按钮和实际的一致) 。在表列中的第一个
项目是逻辑的按钮和实际的 button-1 的关系 , 下一个则是对实际的 button-2
的关系 , 以此类推 。例如 , 颠倒按钮的次序 , 使用命令:xmodmap -e "pointer = 3 2 1 "结果按下滑鼠右边的按钮 , 会被解释成LEFT 。18.1.4 改变键对应xmodmap 让你将一个键 (也就是说键码) 连结到一个新的keysym表列 , 使用表
式:keycode keycode = keysym-1 [keysym-2 ...]安排keysym-1连结到键时没有修饰键 , 当SHIFT 按下时keysym-2连结到键 , 如果
还有下一个keysym的话 , 对keycode 而言是第三顺位等等 。(请记住 , 在前两个
之後的keysym , 系统并未附属特别的意义 , 应用程式如果需要的话可以附属意义
) 。让我们举实际的例子 。一些键盘把一些非字母数字 (alphanumeric)键放在
不标准的地方 , 所以我们假设你要将F6键重定义当没有修饰键按下时为 "9" ,
当SHIFT 按下时为 "(" 。要写入这个xmodmap 的表式 , 你需要知道三件事:F6
的键码 , 和 "9"与 "("的keysym 。我们在第12章提到过 , 执行xev 便可获得
这些:分别按下"F6", "9", "("三个键 , 你便可得到它们的键码和keysym 。然
後将它们放入你的表式中 。例如在我们的系统中我们使用命令:xmodmap -e "keycode 21 = 9 parenleft"为了容易一些 , 你通常不需要查问键码 , xmodmap 允许你使用下列格式:keysym target-keysym = keysym-1 [keysym-2 ...]它的意义为 "附属在此键的keysym表列现在改由target-keysym来附属" 。例如
针对我们方才的□例 , 我们可以用:xmodmap -e "keysym F6 = 9 parenleft"如果你将相同的keysym附属到数个键 , xmodmap 会搞混掉 , 像这种情况你应坚
持使用keycode ... 这种符号表示法 。18.1.5 改变修饰键对应在server中修饰键对应是一个表列的集合 , 每个修饰键有一个表列 。对一个修
饰键的表列中 , 包含了所有当此修饰键被按下时会有意义的键 (键码)。xmodmap
允许你在一个表列中增加项目 , 去除项目 , 或完全清除一个表列 。对此三个操
作的格式为:add modifier = list-of-keysyms
remove modifier = list-of-keysyms
clear modifier不幸的是 , 语法有点儿混淆 , 因为取代你所需的键码 , 你必需指定keysym附属
到键码 。举一个例子:假如你需要在你键盘的右边有一个第二个的Ctrl键 。在我们
的键盘上有一个Alternate 键没有被用来做任何事 , 所以我们将修改它 , 命令
为:xmodmap -e "add Control = Alt_R"为了多解释一些情况 , 让我们假设你没有一个多馀的键 , 但有一个第二个的
Meta键在键盘的右手边 , 而我们要用它 。我们首先必需去除它的Mod1对应 (你
必须使用 "Mod1" , "Meta"没有用) , 而後将它加入Control 对应 。(如果有
需要的话 , 我们可以拥有双重的对应 , 所以在Control-Meta组合键时才会有作
用 , 在一些编辑器中常会用到) 。命令为:remove Mod1 = Meta_r
add Control = Meta_r将上述命令列放入一个比方说叫mymaps的档案中 , 执行命令xmodmap mymaps 。
它可以工作 , 但如果你用xmodmap -pm 去查看 , 你会发觉Control 和Meta混合
在一起 , 所以最好改变键上的keysym为:remove Mod1 = Meta_R
add Control = Meta_R
keysym Meta_R = Control_R在xmodmap 的指南页中 , 有几个更多的交换修饰键的□例 。注意:当增加一个键到修饰键对应 , keysym只是用来指定xmodmap 中的键
。它完全是xmodmap 本地的 , 且只是一个符号而已:只有当相关的键码传递到
server , 才实际上的改变对应 。同样地 , keysym 和 keycode 表式对修饰键对
应绝对没有影响 。一个常见的错误是执行下面这个命令:xmodmap -e "keysym F1 = Contrl_R"期望F1键能像一个control 键般作用 。它不会 -- 因为你相当於告诉系统 "我
已经把这个符号印在F1键上面" 而已 。你应该这样作:xmodmap -e "add Control = F1"如果你合并上一列的命令会使得对应表列看起来清楚些 。我们对不同对应的处理的描述到此告一结束 。
18.2 键盘和滑鼠参数设定 -- xset最後我们来看一看最平常的设施 , 对你的键盘、滑鼠和萤幕设定不同的参数的
设施 。这些参数使用xset程式 (我们曾经用来控制server的字型搜寻路径) 来
设定 。在以下的叙述 , 我们只用一组引数来展示xset , 但你可以同时指定多组
你所要的不同定义的设定 。控制终端机响铃用xset你可以让铃声响或不响 , 设定它的音调 (pitch) , 和它持续的时间 (假
设你的机器提供这些操作):让铃声不响 xset -b
xset b off让铃声能响 xset b
xset b on设定铃声的音量 xset b vol
(最大音量之vol%) 例:xset b 50设定铃声的音量 , 和 xset b vol p
音调(单位Hertz(赫)) 例:xset b 50 300设定铃声的音量 , 音调 , xset b vol p d
和持续的时间(单位百万 例:xset b 50 300 100
分之一秒)控制键的滴答(click)让键的滴答不作用 xset -c
xset c off让键的滴答作用 xset c
xset c on设定滴答声的音量 xset c vol
(最大音量之vol%) 例:xset c 50控制键的自动重复(auto-repeat)让键的自动重复不作用 xset -r
xset r off让键的自动重复作用 xset r
xset r on滑鼠参数 -- 加速和门槛指标在萤幕上的移动和滑鼠的移动是成比例的 。加速 (multiplier) 是应用在
指标移动上的一个乘数 , 例如你的加速是四 , 当你移动滑鼠时 , 指标将以正常
四倍的速度移动 。(如果指标正常时移动n 个像素 , 现在则会移动 4 X n个像
素) 。当你希望在萤幕上将指标移动一段长距离时 , 相当高的加速是很方便 , 但
当你要作一些细部的指引时 , 它看起来就很笨拙 -- 指标看起来在来回跳动 。
为了克服此点 , server提供了一个门槛 (threshold):如果当指标一次移动超
过门槛个像素 , 加速也会被带进来执行 。设定滑鼠的加速到a xset m a
例:xset m 5设定加速 , 设定门槛到t xset m a t
例:xset m 5 10控制萤幕节约器结构萤幕节约器 (screen saver)是一种设施 , 它意图降低一个固定的图样(pattern)
老是燃烧你萤幕的萤光体的机率 。它的理念为萤幕损害大都起因於让系统□置
(idle)一长段时间 , 所以萤幕节约器在一段特定的时间内如果没有输入动作後
, 不是整体性的闪动萤幕 , 便是显示一个不同的图样 。如果你选择的是显示一个不同的图样 , 根视窗的背景涵盖整个萤幕 , 一个
大X 的游标出现在萤幕上 , 且会周期性的移动 。当大X 游标在移动时 , 会改变
大小 , 而且背景也会随机的变动 。(在背景图样较小时你可能不会注意到 , 但
若比较大时 , 你可以看到它在跳动) 。当萤幕节约器结束作用後 , 如果要花许多的时间才能重画应用视窗 , 你可
以指定只有在重画萤幕而不需产生任何曝光(exposure)事件 (也就是不必要求
应用程式重画它们自己的视窗) 的情况下 , 萤幕节约器才会作用 。这只应用
於显示不同的图样的情况 , 整体性的闪动萤幕纯为硬体作用 , 不会影响到应用
程式 。让萤幕节约器能作用 xset s让萤幕节约器不能作用 xset s off用萤幕闪动的方式 xset s blank只有在无曝光事件下才作用 xset s noexpose允许有曝光事件下仍然作用 xset s expose用不同图样的方式 xset s noblank当系统□置t 秒後作用 xset s t
例:xset s 600每p 秒之後改变图样 xset s t p
例:xset s 600 10让我们将这些组合起来 , 假设我们希望萤幕节约器在系统□置80秒後开始作用
, 用不同的图样的方式 , 周期为3 秒 , 不介意曝光事件是否发生:xset s noblank s 80 3 s expose注意:xset s 并不提供 on 这个值 。
18.3 结论本章的第一个部份 , 告诉你如何改变从实际的到逻辑的键和按钮的对应 , 这些
对应可被client应用程式解释 。你看到如何使用xmodmap 来列出或改变每一个
键盘的键、修饰键和滑鼠按钮的对应 。这些对应由server维护 , 所以可以被每
一个使用到此server的应用程式应用到 。这种结构让你有改变键盘配置的自由
, 不论是个人的喜好或是一个额外的标准 。【X Window 系统使用指南--键盘和滑鼠--对应和参数】在本章的第二个部份 , 你看到如何使用xset对一些常见的特性作设定 , 如
键的滴答声、终端机的响铃、萤幕节约器和滑鼠的速度 ("加速") 。