X11等待并获取剪贴板文本

时间:2012-01-06 09:00:03

标签: c x11

我必须监控X11剪贴板。

目前,我每隔5秒请求一次ClipBoard选择,然后我对从剪贴板返回的文本进行哈希处理,并将其与上次检查中的哈希计算进行比较。如果哈希不一样,我会分析文本内容并做一些事情......

我不喜欢我的方法。我来自Windows,使用winapi,它是内核,当剪贴板发生变化时会通知你的程序,并且效率更高!

我只是想知道当剪贴板发生变化时X11是否可以将您的程序通知为winapi?使用X11检查剪贴板修改的更有效方法是什么?

3 个答案:

答案 0 :(得分:4)

使用 Xfixes 扩展程序中的XFixesSelectSelectionInput()并等待XFixesSelectionNotify事件。

实施例:

// gcc -o xclipwatch xclipwatch.c -lX11 -lXfixes
...
#include <X11/extensions/Xfixes.h>
...
void WatchSelection(Display *display, Window window, const char *bufname)
{
  int event_base, error_base;
  XEvent event;
  Atom bufid = XInternAtom(display, bufname, False);

  assert( XFixesQueryExtension(display, &event_base, &error_base) );
  XFixesSelectSelectionInput(display, DefaultRootWindow(display), bufid, XFixesSetSelectionOwnerNotifyMask);

  while (True)
  {
    XNextEvent(display, &event);

    if (event.type == event_base + XFixesSelectionNotify &&
        ((XFixesSelectionNotifyEvent*)&event)->selection == bufid)
    {
      if (!PrintSelection(display, window, bufname, "UTF8_STRING"))
        PrintSelection(display, window, bufname, "STRING");

      fflush(stdout);
    }
  }
}
...

这适用于bufname == "CLIPBOARD"bufname == "PRIMARY"选择。

另见PrintSelection()函数in this answer

答案 1 :(得分:2)

  1. 使用GetSelectionOwner(PRIMARY和CLIPBOARD)选择查找窗口
  2. 通过发送SelectionRequest获取选择的副本,通知您的应用程序
  3. 关注SelectionClear活动
  4. 使用来自SelectionClear事件的ID进行选择的更新窗口,转到步骤2

答案 2 :(得分:0)

这是一个很好的参考:http://www.jwz.org/doc/x-cut-and-paste.html