linux剪贴板原理

在 X window system中,窗体之间传输数据,使用的是“selection”,也就是常说的“剪贴板”

  X window system中支持任意的selection.

  其中,最重要的是PRIMARY selection,然后是CLIPBOARD selection,还有已经废弃的CUT_BUFFER(0~7)。

而 X Window 把这种叫做“选择”(selection),有支持两种方式:一种是主(Primary)选择,一种是剪贴板(Clipboard)选择。其实还有一个副(Secondary)选择,但已经过时不用。和 Windows 不同的是,没有一个全局的缓冲区来保存拷贝的信息。其工作方式是这样的:当一个程序中选择了一些东西,它就说“我现在是当前选择的所有者”,这时在另外一个程序中要进行粘贴的话,就向当前选择的所有者发请求,请求获取数据。然后所有者就给请求者发送数据。其中的过程可以认为是进程间通讯。

  先说剪贴板选择,其用于菜单的拷贝、粘贴、剪切选项,看上去跟 Windows 的拷贝粘贴方式是一模一样的,只是选择了以后,点击了拷贝(或者快捷键也可以),这时候要声明所有权,然后在内部保存一份需要拷贝的东西。当别的程序粘贴的时候,把保存的东西发送过去。

  主选择略微有点不同,当你选择任何东西的时候(鼠标或者键盘),当前程序就声明所有权(不需要明确进行拷贝),并保存一份。当别的程序用鼠标中键(或者左右同时双击来模拟)进行粘贴的时候,把数据发送过去。

  所以总结一下,X 内部的实现方式,对于一个程序:

  使用鼠标或者键盘选择一段文本:声明主选择(Primary)所有权(可能内部也要保存一份)

  拷贝(菜单或者快捷键):内部保存一份,声明剪贴板(Clipboard)所有权

  粘贴(菜单或者快捷键):获取剪贴板中的数据,并插入到适当的位置

  鼠标中键(或者双键模拟):获取主选择的数据,并插入到适当的位置

  另一个程序请求主选择数据:把内部保存的主选择发送出去

  另一个程序请求剪贴板数据:把保存的剪贴板数据发送出去

  另一个程序声明主选择所有权:丢弃保存的主选择数据

  另一个程序声明剪贴板所有权:丢弃保存的剪贴板数据

  这只是一个比较简单的描述,实际上的实现要更复杂一些,具体请参考 [ICCCM] 的文档。

  X 上绝大部分程序都是支持主选择的,也可以认为缺省就是支持的。有一些对剪贴板的支持不够明显,没有菜单或者快捷键之类的,只能用鼠标进行选择,比如多数的 Terminal Emulator,但提供了快捷键。xterm/rxvt/urxvt/mrxvt 等可以使用“Shift + 鼠标中键”从剪贴板拷贝。Emacs 使用主选择。更多的程序用的是剪贴板。

 

你可能感兴趣的:(linux,剪贴板,xclipboard)