c - X11 等待并获取剪贴板文本

标签 c x11

我必须监视 X11 剪贴板。

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

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

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

最佳答案

使用 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 .

关于c - X11 等待并获取剪贴板文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8755471/

相关文章:

在 Eclipse Kepler 中创建 C 项目

c++ - argc从哪里来?

c++ - X11 的 WM_ACTIVATE 和 WM_SYSCOMMAND 消息等价物

C套接字内存溢出

c - 带有换行符的 printf 导致奇怪的段。过错

c - 如何将长整数映射到较小整数(和快速逆)的 N 维 vector ?

c - FMOD功能的实现

c++ - 检测键盘/条形码扫描仪事件的来源

unix - X11。如何知道 window 的完整尺寸(及其装饰物的尺寸)

multithreading - XInitThreads() 的缺点是什么?