快速业务通道

在tightVNC中使用剪贴板

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-20

  测试平台:

  tightVNC 1.3.0

  Ubuntu 10.04

  vncviewer on Windows

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

  X window system中支持任意的selection.

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

  在VNC中,服务器和客户端之间使用了CUT_BUFFER0来传输数据.

  而在X中,我们常用的对于字符串的“复制”和“粘贴”使用的是CLIPBOARD selection.因此,为了让VNC的客户端和服务器之间能进行字符串的拷贝,我们需要将“CLIPBOARD”和“CUT_BUFFER0”之间进行互相的拷贝.

  目前,我采用的autocutsel这个工具来完成这项任务,它能能够自动的完成“CLIPBOARD”和“CUT_BUFFER0”之间进行互相的拷贝.

  该命令的格式如下:

  $ autocutsel -s PRIMARY/CLIPBOARD -cutbuffer 0

  如果加上“-f”选项,则可以在后台运行,推荐把它加载到X startup 脚本中.

  注:

  在X环境下,使用以下命令可查看CUT_BUFFER0中的内容

  $ xprop -root CUT_BUFFER0

  参考文档:

  http://supermmx.org/blog/20060908_vnc_copy_paste

  原文如下:

  公司里面进行开发全部都是使用 [VNC](Virtual Network Computing),服务器是 Solaris 或者 Linux,客户端基本上都是 Windows.那经常会用到两个系统之间的拷贝和粘贴.成功与否涉及到了好几个方面,服务器端的机制、所用的终端(应用程序)、VNC 客户端等等,都可能对此有影响.其中在用的时候或多或少地碰到了一些问题,一贯的风格又来了,就想把这个东西的原理机制什么的搞清楚,这样才对得起自己的脑袋瓜.

  既然我自己的应用方式只有这么一种,就是 Windows 连 *nix,就只考虑这种情况,其中不同的情况时候有所不同,这里也就不深究了.Windows 大家用的比较久,也比较熟悉,它有一个全局的缓冲区(Clipboard,剪贴板),当一个程序选择一段数据,选择拷贝,就将选中的文字拷贝到这个缓冲区里面保存起来,然后在另外一个程序中选择粘贴,就从缓冲区里取出相应的数据,插入到正文中去.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  好了,两边自己内部的说完了,该说说中间的桥梁 VNC 了.其实中间漏了一个“剪切缓冲区”(Cut Buffer),这个是最早的实现方法,现在已经丢弃不用,但是,确实还在用着,比如 xterm 之类的终端模拟器和 Emacs,同时更新主选择和这个缓冲区.它一般用的名字是 CUT_BUFFER0,可以有多个.VNC Server 和 Windows 之间的拷贝粘贴的数据交换,就是通过 VNC Viewer 同步这个 CUT_BUFFER0 和 Windows 的剪贴板.当然一般的 VNC Viewer 都会有是否同步之类的选项.而我一直用的都是 rxvt/mrxvt 和 Emacs,一直以来没有互相不能拷贝粘贴的问题,而别人大多用 gnome-terminal 或者 konsole 之类,实现不了拷贝粘贴.

  那么如何来做到让不使用剪切缓冲区的程序也能和 Windows 互相拷贝粘贴呢?这就得用外部程序来帮忙了.xcutsel 就是把数据在“选择”机制和剪切缓冲区之间拷贝的程序,可以选择 Primary 或者 Clipboard.这样从 Windows 拷贝过来,需要点击“copy 0 to PRIMARY(或者 CLIPBOARD)”,拷贝过去需要点“copy PRIMARY(或者 CLIPBOARD) to 0”.还有另外一个是 [autocutsel],和上一个功能一样的,只不过是自动进行,不需要手动拷贝.我没用过 :)

  其实最好的办法是对于 X Window,VNC Server 和 VNV Viewer 之间使用建议使用的方法(主选择或者剪贴板),丢弃掉剪切缓冲区,毕竟是已经过时了的东西.

  额外提一句,上面写的这些都是没有看过代码的,都是二手资料,肯定有不正确的地方,还请指教.

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号