X window selection --- xclip

2023-05-16

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

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

文章目录

    • Active and passive selections (主动和被动selection)
    • Selections
    • Clipboard
    • Cut buffer.s
    • XDND
    • Programs
    • See also
    • References

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

  • X Window System protocols and architecture
  • X Window System core protocol
  • ICCCM

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
(本文完)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

X window selection --- xclip 的相关文章

  • 如何选择任意行的相邻行(在 sql 或 postgresql 中)?

    我想根据特定条件选择一些行 然后从该集合中取出一个条目及其前后的 5 行 现在 如果表上有主键 例如 主键在数值上比目标行的键小 5 且比目标行的键多 5 我可以在数字上执行此操作 因此选择主键为 7 的行及其附近的行 select pri
  • 将元素与窗口底部对齐,但允许滚动到下方的内容

    我现在正在编写一个 jquery 滑块 并将宽度设置为 100 并且无论窗口如何调整大小 我都希望它与窗口底部对齐 我已经找到了让它在向下滚动时一直粘在底部的方法 但我不希望这样 我希望能够滚动到此滑块下方以获取更多内容 这个网站展示了我正
  • (iPhone) selectedRange 用于不可编辑的 UITextView (或其他点击处理方法?)

    我正在使用一个UITextView保存静态内容 中文意思是字符都是固定宽度的 我想让用户单击文本中的某个字符并显示该字符的字典信息 我知道所有与缺乏复制和粘贴相关的问题 但我希望有一种方法可以做到这一点 而无需等待 iPhone 3 0 固
  • 窗口调整大小指令

    我试图在窗口调整大小时调整 div 大小 环顾四周后 似乎使用指令是最好的解决方案 模板 div div 指示 myApp directive elheightresize window function window return lin
  • 从渲染器接收消息超时:600.000 当我们使用 Jenkins windows 服务模式执行 selenium 脚本时

    我们每天都使用 jenkins 窗口服务 无头模式 执行我们的 selenium 自动化脚本 直到昨天它都工作正常 突然它停止工作并且无法启动浏览器 它显示以下错误消息 15536 77874 187 严重 从渲染器接收消息超时 600 0
  • 如何使用本机 Win32 API 从焦点窗口获取选定的文本?

    我的应用程序 将在系统上运行尝试监视热键 当用户在任何窗口中选择某些文本并按下热键时 当我收到 WM HOTKEY 消息时 如何获取所选文本 为了将文本捕获到剪贴板 我尝试发送Ctrl C using keybd event and Sen
  • 在 PowerShell 窗口中运行应用程序

    我正在尝试放弃命令提示符 因为它是一个死胡同 转向 PowerShell ISE 我还没有弄清楚如何在 PowerShell ISE 窗口中运行命令行应用程序 每次我使用 开始进程 时 都会出现 然后消失 命令提示符窗口 我看到有些人建议
  • 从 Intent.createChooser 获取选择的应用程序

    我正在尝试捕捉结果Intent createChooser了解用户选择共享哪个应用程序 我知道有很多与此相关的帖子 如何知道用户在使用意图选择器时选择了哪个应用程序 https stackoverflow com questions 106
  • contenteditable div退格和删除文本节点问题

    contenteditable div 以及删除可编辑 div 内的 html 和 或非内容可编辑内容存在很多问题 使用优秀 Tim Down 的回答 如何删除具有 contentEditable 属性的 div 内的 HTML 元素 ht
  • 每个版本的 IE 在新窗口中打开链接

    我一直在设计一个网站 并使用 Safari 和 Chrome 进行大部分测试 我刚刚尝试测试 Firefox 也很顺利 让 IE 来解决吧 由于某种原因 对于从 IE 6 到 IE 10 的每个版本 每个链接都会打开一个新窗口 在 IE 1
  • 如何应用圆角边框来突出显示/选择

    我用过视觉工作室在线 http visualstudio com对于一个项目来说有一段时间 他们将圆形边框应用于在线代码查看器中的选择的方式非常有趣 我尝试检查该元素并寻找某种自定义 CSS 但没有成功 我有一种感觉 这需要一些复杂的 技巧
  • 在父级构造函数中设置窗口所有者时遇到问题

    在 WPF 中 在父窗口的构造函数中将窗口的 Owner 属性设置为其父窗口是否有任何问题 不应该有吧 那么为什么我会得到一个XamlParseException从下面的代码 public partial class MainView Wi
  • Javascript 在 window.open 之后调用函数

    我试图在 window open 函数完全加载后调用一个函数 然而 使用 onload 函数调用得太早了 所点击的 URL 将打开一个 Excel 电子表格 下载可能需要 2 秒到 1 分钟 一旦 window open 函数被调用 onl
  • 如何禁止chrome打开“新窗口”和“标签”?

    他们是否可以通过 Chrome 浏览器设置将互联网上的所有页面保留在一个窗口中 或者我可以用一个插件 插件来做到这一点 当我单击某些链接时 我不希望在新选项卡和 或新窗口中打开网页 如果有人有任何建议请告诉我 谢谢 a href http
  • 从树视图中选择会自动将字符串数字转换为整数

    在我正在开发的项目中 您可以编辑以树形视图形式显示的数据内容 数据字段之一是始终以 0 开头的电话号码 在表中选择正确的记录并使用其中提取数据时tree item tree selection 由于某种原因 电话号码会自动转换为整数 因此当
  • JavaScript 丢失带有私有/公共属性的“this”对象引用

    我在运行以下页面时出现以下错误 this testpublic 不是一个函数 test function var testprivate function this testpublic this testpublic function c
  • 无法打开目标 = 空白的 Electron webview 链接

    我正在使用 Electron 我有一个显示外部网站的 webview 但我无法成功显示通常由该网站上的链接打开且目标 blank 的附加窗口 a href mentions html target blank Mentions l gale
  • DPI 意识真的需要吗?

    我正在学习如何使用 GDI GDI 绘制 GUI 我发现了这个http msdn microsoft com en us library windows desktop dd756596 v vs 85 aspx step 2 declar
  • 如何在 C# WPF 中让主窗口等待新打开的窗口关闭?

    我是 WPF 和 C 的新手 请耐心等待 我有一个主窗口 它打开一个新窗口 现在这个新窗口是一个提示是否覆盖文件的提示 主窗口访问新窗口中的一个公共变量来检查提示的结果 但我无法让主窗口处理等到新窗口关闭 Window1 Win new W
  • 如何使 Selenium WebDriver 动态选择客户端证书而不用视觉检测弹出窗口

    我正在尝试使用 Java 和 Selenium 来测试需要客户端证书的网站 当我浏览我的网站时 我会看到一个如下所示的弹出窗口 以选择正确的证书 我的要求如下 按名称选择证书 在不同版本的 Windows IE Edge 上 理想情况下 永

随机推荐