30.22.2 其他选区

MS-Windows、Nextstep、Haiku 与 Android 等窗口系统下的选区机制与 X 系统并不一致。这些窗口系统各自实现了独立的选区机制,并未采用上一节所述的 “选区转换器(selection converter)” 机制。通常仅支持 PRIMARYCLIPBOARDSECONDARY 三类选区,同时 Nextstep 与 Haiku 还提供用于记录拖放数据的 XdndSelection 选区。

GTK 试图模拟 X 选区系统,但其模拟效果并非完全可靠,整体质量取决于所使用的 GDK 后端。因此,使用 PGTK 编译的 Emacs 会提供与 X 版本相同的选区接口,但很多选区目标实际无法使用。

MS-Windows 操作系统虽提供剪贴板,但并无主选区或次选区的概念。在该系统上,Emacs 会模拟主选区与次选区,并在需要时向系统剪贴板保存或读取数据。

主选区与次选区的模拟通过将传递给 gui-set-selection 的值保存在对应选区符号的 x-selections 属性中实现,该选区由 gui-get-selectiontype 参数指定。后续每次调用 gui-get-selection 都会返回该值,且不会进行类型检查等进一步验证。这种情况下,data-type 参数通常会被忽略。(但有关 TARGETS 的特殊说明见下文。)

对于剪贴板选区(即 typeCLIPBOARD 时),gui-set-selection 会验证传入值是否为字符串,并在通过 selection-coding-system 指定的编码系统编码后保存到系统剪贴板。调用 gui-get-selection 时需将 data-type 设置为 STRINGTARGETS

若调用 gui-get-selectiondata-type 设为 TARGETS,且选区数据存在,则会返回一个符号向量,行为与 X 下类似。除 STRING 外无法以其他格式请求剪贴板数据,因为缺少必要的数据转换例程。存入剪贴板的字符串由 selection-coding-system 编码,从剪贴板读取的字符串则由同一编码系统解码;若选区文本存入剪贴板时出现问题,应重点检查该变量及其相关变量 next-selection-coding-system

Nextstep 同样实现了 X 系统中的三类标准选区,但 Emacs 仅能向这些选区保存字符串。该平台下对 gui-set-selection 的调用限制与 MS-Windows 基本相同,不过文本统一使用 utf-8-unix 编码,不受 selection-coding-system 值影响。gui-get-selection 则更为宽松,支持以下选区目标:

Nextstep 同样支持 XdndSelection 选区,它以存储区形式保存传递给 gui-set-selection 的值。其唯一用途是为基础拖放函数 x-begin-drag 保存数据(see 拖放);其他程序读取时其值不做任何保证。

Haiku 系统支持 X 系统下常用的三类选区,以及用于记录拖放数据的 XdndSelection

对前三类选区调用 gui-set-selection 时,传入的数据会由一系列 选区编码器(selection encoder) 函数转换为窗口服务器 “消息(message”)”,并发送至窗口服务器。

Variable: haiku-normal-selection-encoders

选区编码器函数列表。调用 gui-set-selection 时,列表中的每个函数会依次被调用,并传入 selectionvalue 参数。若某函数返回非 nil 值,其返回值必须为格式为 (key type value) 的列表。其中 key 为传输数据的名称,通常为 MIME 类型,例如 ‘"text/plain"’;type 为标识数据类型的符号或数字,决定 value 的解析方式。以下为合法数据类型列表及其对 value 的解析规则:

string

单字节字符串。该字符串存入消息后会以 NULL 结尾。

ref

文件名。系统会定位该文件,并将其索引节点存入消息。

short

16 位整数值。

long

32 位整数值。

llong

64 位整数值。

byte
char

0 至 255 之间的无符号字节。

size_t

介于 0 与 Emacs 运行平台字长对应的 2 的幂减一之间的数值。

ssize_t

符合 C 语言 ssize_t 类型范围的数值。

point

由两个浮点数组成的 cons,代表屏幕坐标。

float
double

单精度或双精度浮点数,格式未指定。

(haiku-numeric-enum MIME)

包含指定 MIME 类型数据的单字节字符串。

调用 gui-get-selection 通常会返回选区消息中名为 data-type 的数据;若 data-type 属于下列 X 选区目标之一,则会被替换为对应名称:

STRING

对应 X 下的 Latin-1 文本:“text/plain;charset=iso-8859-1”

UTF8_STRING

对应 UTF-8 文本:“text/plain”

data-type 为文本类型(如 STRING)或匹配 ‘`text/*'’ 模式的 MIME 类型,字符串数据会在返回前使用对应编码系统解码。

此外,TIMESTAMPTARGETS 两种数据类型会被特殊处理:前者返回系统启动后选区被修改的次数(并非时间戳),后者返回可用选区数据类型组成的向量,与其他平台一致。

与 MS-Windows 类似,Android 提供剪贴板但不支持主选区与次选区;gui-set-selection 通过将值存入变量模拟主、次选区,后续 gui-get-selection 调用会返回该变量内容。

gui-get-selection 可从剪贴板读取 STRING 类型的 UTF-8 字符串数据、TARGETS 数据类型,以及任意 MIME 类型的图像与应用数据。gui-set-selection 仅能设置字符串数据,与 MS-Windows 类似,但该数据不受 selection-coding-system 影响。与之相对,主、次选区仅支持字符串数据读写;由于这些数据不会与其他程序通信,因此无需经过任何编码系统的编解码。