X11 Warten auf und Abrufen von Text aus der Zwischenablage

Lesezeit: 2 Minuten

Benutzer-Avatar
Josh Brian

Ich muss die X11-Zwischenablage überwachen.

Im Moment fordere ich die ClipBoard-Auswahl alle 5 Sekunden an, dann hash ich den aus der Zwischenablage zurückgegebenen Text und vergleiche ihn mit der Hash-Berechnung aus der letzten Überprüfung. Wenn die Hashes nicht gleich sind, analysiere ich den Textinhalt und mache ein paar Sachen …

Ich mag meine Methode nicht. Ich komme von Windows, und mit der Winapi ist es der Kernel, der Ihr Programm benachrichtigt, wenn sich die Zwischenablage geändert hat, und es ist effizienter!

Ich möchte nur wissen, ob es möglich ist, dass X11 Ihr Programm als winapi benachrichtigen kann, wenn sich die Zwischenablage geändert hat. Was ist der effizientere Weg, um Änderungen an der Zwischenablage mit X11 zu überprüfen?

Verwenden XFixesSelectSelectionInput() aus Xfixes Verlängerung und warten XFixesSelectionNotify Veranstaltung.

Beispiel:

// 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);
    }
  }
}
...

Dies funktioniert sowohl für bufname == "CLIPBOARD" und bufname == "PRIMARY" Auswahl.

Siehe auch PrintSelection() Funktion in dieser Antwort.

  • Bitte geben Sie keine obligatorischen Befehle ein assert(), Weil assert() hinterlässt den Eindruck, dass es weggelassen werden kann (sehen NDEBUG). Besser: int xfixinstalled = XFixesQueryExtension(display, &event_base, &error_base); assert(xfixinstalled);

    – Tine

    29. Mai 2020 um 14:56 Uhr

  • Mir scheint X11/extensions/xfixes.h in meinem Ubuntu 20.04 zu fehlen – hast du eine Idee, wo ich es finden kann? Muss da was installiert werden? Ich sehe nur xfixesproto.h

    – Tofutim

    29. November 2021 um 0:39 Uhr


Hier ist eine gute Referenz: http://www.jwz.org/doc/x-cut-and-paste.html

  • Dies beantwortet die Frage nicht.

    – Jay Conrod

    6. Januar 2012 um 17:03 Uhr

  1. Fenster mit Auswahl finden mit GetSelectionOwner (PRIMARY und CLIPBOARD)
  2. Erhalten Sie eine Kopie der Auswahl, indem Sie eine SelectionRequest senden, und benachrichtigen Sie Ihre Bewerbung
  3. achten Sie auf SelectionClear Veranstaltung
  4. Aktualisierungsfenster mit Auswahl mit ID von SelectionClear Ereignis, gehen Sie zu Schritt 2

  • Was tun Sie, wenn der Auswahlbesitzer geschlossen ist?

    – retroj

    21. Dezember 2017 um 4:44 Uhr

Die akzeptierte Antwort von x11user ist gut. Aber Sie möchten wahrscheinlich eine nicht blockierende While-Schleife, und dafür können Sie diese Antwort nehmen und sie so anpassen.

// get the internal X11 event file descriptor
int x11fd = ConnectionNumber(display);

while(!shutdown)
{
  if(!XPending(display)) {
    // wait on the file descriptor
    // you can use poll, epoll, select, eventfd, etc.
  }

  XNextEvent(display, &event);
  // process the event
}

1231650cookie-checkX11 Warten auf und Abrufen von Text aus der Zwischenablage

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy