X window selection --- xclip

原文(英文) url:https://encyclopedia.thefreedictionary.com/X+Window+selection

本文为笔者的翻译,红色部分为笔者增加的批注。

Selections, cut buffers, and drag-and-drop(拖放)X window 系统中用于允许用户将数据从一个窗口传输到另一个窗口的机制。当用户在一个窗口选择文本或一些其他的数据,而在另一个窗口粘贴时使用 Selectionscut buffer 。当用户在一个窗口中选择了某个内容,然后单击 selection 并将其拖放到另一个窗口时使用 Drag-and-drop

由于这两个窗口可以由两个不同的应用程序处理,因此这些机制需要两个不同的客户机连接到同一个X server来交换数据。X Window 核心协议包括一些特定于 selection 交换的请求和事件,但传输主要是使用事件发送和窗口属性完成的,它们不是特定于 selection 传输的。

可以传输不同类型的数据:通常是文本,但也可以是 p_w_picpath、数字、对象列表等。在下面,只考虑文本传输的情况。

Active and passive selections (主动和被动selection)

传输数据的方法可分为主动和被动两种,使用哪种传输方式取决于处理所选数据的客户端是否必须主动参与向请求数据的客户端传送数据:

Passive (被动)

当某些数据被选中时,处理此选择的窗口的客户端将它传输到其他地方,而不再需要关心它;

Active (主动)

将数据传递给客户需要客户 “持有(holding)” selection 主动参与交换;

Selectionsdrag-and-drop主动机制:在窗口中选择了一些文本后,处理窗口的客户端必须主动支持将数据传输到请求它的应用程序的协议。相比之下,cut buffers是一种被动机制:在某些文本被选中后,它被传输到剪切缓冲区,即使处理该窗口的应用程序终止并且该窗口被销毁,它也会保留在那里。

主动机制的一个优点可以在传输之前将数据转换为不同的格式。特别是,接收数据的客户端可以请求将选择数据转换为合适的形式。如果发送客户机拒绝这样做,接收方可以请求一种不同的格式。例如,一段呈现HTML代码的文本可以作为文本传输给只能处理文本的请求程序,但是如果请求程序能够处理它,也可以作为HTML代码传输这种格式的协商不能由被动机制完成,在这种机制中,持有 selection(并为其提供语义)的客户端将selection传输到请求它的客户端并不涉及进一步的传输

主动机制的另一个优点是,可以通过一系列(数据块)传输而不是单个传输来传输大量数据被动机制要求将所有数据从selection所有者转移到某个地方(剪贴缓存区),然后再转移到请求它的客户端

被动机制的优点是即使在持有数据的客户端终止之后,也可以完成传输。这在主动机制中是不可能的,因为主动机制要求持有数据的客户端积极地参与传输。

Selections

X Window 系统支持任意数量的选择;每个选择都由一个字符串(更准确地说,一个原子)标识。最常用的selection是PRIMARY selection选择。

以下是针对selection转移的请求,虽然转移也涉及到其他请求:

  1. 请求知道哪个窗口拥有selection (请求知道 selection 的拥有者是哪个窗口)
  2. 请求设置拥有selection的窗口
  3. 请求转换selection

selection 的所有者通常是所选文本所在的窗口(如果有的话)。当用户在窗口中选择一些文本时,处理该窗口的客户机必须告诉服务器该窗口是所选内容的所有者。

当用户试图将选择粘贴到另一个窗口时,该窗口的处理程序将启动一个协议,以便从另一个客户端获取所选文本。该协议涉及上述列表中的第二个和第三个请求,并没有由X协议指定,而是作为 Inter-Client Communication Convention Manual (客户端间通信约定手册) (ICCCM)中的约定。

特别是,目标客户端首先询问服务器哪个窗口拥有所选内容。然后这两个客户端通过服务器传输选择。这种交换涉及到窗口的一个属性,即附加到窗口的任意数据段。如果选择的内容被认为足够小,可以一次全部转移,会按照以下步骤进行:

  1. selection 的接收者请求转换选择,指定窗口的属性(这可能是需要粘贴文本的窗口)
  2. 作为响应,服务器向 selection 的当前所有者发送SelectionRequest事件;
  3. 所有者将选中的文本放在请求者通过向服务器发送ChangeProperty请求指定的窗口属性中
  4. 所有者向服务器发送一个请求,向请求者发送一个SelectionNotify,以通知所选内容已被传输
  5. 请求者现在可以通过向服务器发送一个或多个GetProperty请求来读取窗口属性中的选择;
  6. 请求者销毁该属性;如果所有者要求被告知这一点,它将被发送一个PropertyNotify事件。

图1 selection的接收者/请求者、拥有者与X server 之间的交互

图1 selection的接收者/请求者、拥有者与X server 之间的交互

此图是根据自己的理解绘制,可能存在错误,若发现,请在评论中提醒或私信我改正。

如果内容很大,就应该分块传输。在这种情况下,两个客户机都表示对PropertyNotify事件感兴趣:通过这种方式,选择所有者知道什么时候读取了选择,请求者知道什么时候在属性中放置了另一个块。

Clipboard

最常用的selection是PRIMARY,在用户选择某些数据时使用。CLIPBOARD 选项用于当用户选择一些数据并显式地请求将其“复制”到剪贴板时,例如通过调用应用程序的“编辑”菜单下的“复制”,剪贴板选择将被使用。一个“粘贴”的相关请求会导致使用剪贴板选择的数据。

在核心协议的级别上,PRIMARY 和 CLIPBOARD 的选择没有区别。但是xclipboard客户端使它们的行为有所不同。特别是,当另一个客户端断言CLIPBOARD 选择的所有权时,这个程序会请求并在一个窗口中显示它。对这个选择的任何进一步请求都由xclipboard处理。这样,选择的内容在客户端复制后可以保存下来。

Cut buffer.s

Cut buffers是传输数据的另一种机制,特别是传输选定的文本。它们是根窗口(root window)的窗口属性,名为 CUT_BUFFER1,等等。与 selections 不同,cut buffers不涉及客户端之间的直接交互。相反,当在窗口中选择文本时,窗口所有者将该文本复制到名为CUT_BUFFER1的根窗口的属性中。当用户将文本粘贴到另一个窗口时,窗口所有者将读取根窗口的此属性。

xcutsel 程序在selections 和 cut buffers之间传输数据,xcb 程序允许对 cut buffers 进行各种访问。

cut buffers目前在考虑废弃。

XDND

X Window 系统中的Drag-and-drop是由Xdnd约定控制的。当用户将选中的文本拖放到窗口中并释放鼠标按钮时,就会按照primary selection进行数据交换。由于在drag过程中发生的事情,Drag-and-drop 变得更加复杂。也就是说,当用户将selection拖动到桌面或窗口的不同部分时,用户希望能够判断文本是否可以drop。特别是,目标应该显示是否接受放下的视觉反馈,光标应该改变以指示将要采取的动作;复制或移动。

在Xdnd协议中,选中文本并开始拖动的窗口称为source;光标悬停在上面的窗口称为目标窗口。源和目标之间的通信是由源驱动的,因为源“抓取”了光标。因此,源和目标之间的交换是必要的,目的是让目标甚至知道拖放正在发生。由于源决定游标的形状,因此源必须接收来自目标的响应,以便更新游标。此外,由于目标可能需要画一个投弹瞄准器来指示空投将在何处发生,并且由于接受空投可能取决于光标的确切位置,因此在光标移动时必须重复进行这种交换。事实上,即使光标不移动,也必须交换消息,以便在光标接近观察区域的边缘时允许目标滚动。否则,用户将只能拖放到目标的可见部分。

程序可以通过创建一个名为XdndAware的属性来声明窗口可以成为drop的目标,该属性包含程序所支持的协议的最高版本。这样,支持新版本的应用程序就可以回到旧版本,以便正确地互操作。此外,所有编写的不支持Xdnd的应用程序将被忽略。

当光标进入目标窗口时,源检查该窗口上是否存在XdndAware属性。如果这个属性存在,交换开始:

  • 源通过发送一个事件XdndEnter来告诉目标,在拖放一些数据的同时,光标已经进入了目标
  • 通过查看这个事件,并可能通过与源的进一步交互,目标可以找到被拖动的数据类型(文本、p_w_picpath 等)

当光标在目标窗口内时:

  • 源发送XdndPosition事件来告诉目标光标当前的位置
  • 目标响应XdndStatus事件,以告诉源是否可以将数据删除到当前位置
  • 当光标离开窗口或按钮被释放时,源发送一个消息XdndLeave或XdndDrop

如果用户drop,目标像往常一样从源请求选择。当选择的传输结束时,目标发送一个XdndFinishevent来告诉源传输已经成功。

总之,协议是由源驱动的,它让目标知道光标发生了什么。作为回应,目标告诉源是否接受drop。当用户释放鼠标按钮时,也必须通知目标,因为此事件启动了对选择的常规请求,这是由目标驱动的协议。

上面是对拖放的Xdnd约定的描述。在 Motif, OffiX 和 Amulet.中使用不同的 drag-and-drop 约定。

Programs

以下程序专门操作数据传输机制:

  • xcutsel 将数据从selection传输到cut buffers,反之亦然
  • xclipboard、glipper (Gnome)和klipper (KDE)都是剪贴板管理器,也可能是wmcliphist
  • xcb 显示剪切缓冲区的内容,并允许用户对其进行操作
  • xselection, xclip, xsel and xcopy是将数据复制到或从X selection中复制的命令行程序。
    xcopy有一个冗长选项,可以帮助调试X selection issues。
  • synergy 是一个跨平台工具,允许您跨运行多个操作系统的多台计算机共享剪贴板
  • Xfce4 -clipman-plugin是一个“用于Xfce4面板的剪贴板历史插件”,也是一个剪贴板管理器
  • xtranslate 在多语言字典的Xselection中查找单词
  • autocutsel 同步cut buffer和 selection buffer

See also

References

  1. Zawinski, J. W. (2002). X selections, cut buffers, and kill rings. Retrieved July 13, 2010, from http://www.jwz.org/doc/x-cut-and-paste.html
(本文完)