X11 Жди и получи текст буфера обмена - PullRequest
14 голосов
/ 06 января 2012

Я должен следить за буфером обмена X11.

На данный момент я запрашиваю ClipBoard Selection каждые 5 секунд, затем я хеширую текст, возвращенный из буфера обмена, и сравниваю его с хешем, вычисленным по последней проверке. Если хэш не совпадает, я анализирую текстовое содержимое и делаю кое-что ...

Мне не нравится мой метод. Я из Windows, а с winapi именно ядро ​​уведомляет вашу программу об изменении буфера обмена, и это более эффективно!

Я просто хочу знать, возможно ли, чтобы X11 мог уведомить вашу программу как winapi, когда буфер обмена изменился? Какой самый эффективный способ проверить изменения в буфере обмена с X11?

Ответы [ 3 ]

4 голосов
/ 09 июля 2017

Используйте XFixesSelectSelectionInput() из Xfixes расширение и дождитесь события 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() функция в этом ответе .

2 голосов
/ 07 февраля 2012
  1. Найти окно с выделением, используя GetSelectionOwner (ПЕРВИЧНАЯ и КЛИПАТИЧЕСКАЯ), 1003 *
  2. получить копию выбора, отправив SelectionRequest, уведомить вашу заявку
  3. часы для SelectionClear события
  4. обновить окно с выбором, используя идентификатор из события SelectionClear, перейдите к шагу 2
0 голосов
/ 06 января 2012

Вот хороший справочник: http://www.jwz.org/doc/x-cut-and-paste.html

...