Glfw: Unterstützung für die inkrementelle Übertragung von Auswahlen hinzufügen

Erstellt am 15. Apr. 2014  ·  5Kommentare  ·  Quelle: glfw/glfw

Sie können dies mit der Zwischenablage-App aus dem Testordner wiederholen. Hier ist

Error: X11: Failed to convert selection to string
Clipboard does not contain a string
X11 bug verified

Hilfreichster Kommentar

Ich habe mich selbst darum gekümmert, aber ich konnte die Implementierung nicht abschließen. Hoffentlich kann ein Teil der Erfahrung bei dem Versuch, es zu implementieren, für jemand anderen von Nutzen sein, der versucht, dasselbe zu tun. Kurz gesagt, hier ist, was passiert und was ICCCM von uns erwartet, um mit diesem INCR-Atom umzugehen:

Im Folgenden wird X11 beim Aufrufen von _glfwPlatformGetClipboardString sehr traurig:

if (_glfwGetWindowPropertyX11(event.xselection.requestor,
                              event.xselection.property,
                              event.xselection.target,
                              (unsigned char**) &data))
    _glfw.x11.clipboardString = strdup(data);

Der Grund dafür ist, dass wir event.xselection.target vom Typ UTF8_STRING anfordern, was die meiste Zeit funktioniert, außer wenn wir die maximal zulässige Einzelbatch-Übertragungsgröße des Auswahlbesitzers (262146 Byte in) überschritten haben dieser Fall). Der Auswahlinhaber gibt uns stattdessen ein actualType von INCR das nicht mit dem angeforderten Typ UTF8_STRING identisch ist. Der Eigentümer möchte Daten inkrementell senden, dh in Blöcken von mehreren XGetWindowProperty s, die UTF8_STRING s enthalten.

Um dies zu lösen, müssen wir der ICCCM-Empfehlung "INCR Properties" folgen. Aber auf den Punkt gebracht:

  1. Holen Sie sich ein Handle für das INCR -atom mit XInternAtom z. B. mit dem Namen INCR_STRING .
  2. Siehe in _glfwGetWindowPropertyX11 wenn wir actualType von INCR_STRING , wenn ja:
    a) Holen Sie sich INCR_STRING mit XGetWindowProperty , es enthält eine niedrigere Übertragungsgrenze.
    b) Löschen Sie diese INCR_STRING -Eigenschaft, damit der Eigentümer uns die guten Sachen schicken kann.
    c) Warten Sie auf ein PropertyNotify -Ereignis, das das Eintreffen eines Teils der vollständigen Daten signalisiert.
    d) Rufen Sie Blockdaten mit XGetWindowProperty und hängen Sie sie an einen Puffer an.
    e) Löschen Sie die Eigenschaft und signalisieren Sie dem Eigentümer, zusätzliche Blöcke zu senden.
    f) Überprüfen Sie, ob die Größe der Daten Null ist, wenn Sie nicht zu c zurückkehren.
    g) Übertragung abgeschlossen, Sie haben jetzt die gesamten Daten!

Wenn Sie interessiert sind, finden Sie hier eine halbfertige Übersicht über die inkrementelle Auswahl, die ich geschrieben habe.
Hier sind einige Links, die ich bei der Untersuchung des Problems als nützlich empfunden habe:

Hoffentlich nützt das jemandem etwas, ich konnte es leider nicht selbst herausfinden.

Alle 5 Kommentare

GLFW unterstützt noch keine inkrementelle Datenübertragung in der Zwischenablage.

Hinweis für sich selbst: UTF8_STRING

Ich habe mich selbst darum gekümmert, aber ich konnte die Implementierung nicht abschließen. Hoffentlich kann ein Teil der Erfahrung bei dem Versuch, es zu implementieren, für jemand anderen von Nutzen sein, der versucht, dasselbe zu tun. Kurz gesagt, hier ist, was passiert und was ICCCM von uns erwartet, um mit diesem INCR-Atom umzugehen:

Im Folgenden wird X11 beim Aufrufen von _glfwPlatformGetClipboardString sehr traurig:

if (_glfwGetWindowPropertyX11(event.xselection.requestor,
                              event.xselection.property,
                              event.xselection.target,
                              (unsigned char**) &data))
    _glfw.x11.clipboardString = strdup(data);

Der Grund dafür ist, dass wir event.xselection.target vom Typ UTF8_STRING anfordern, was die meiste Zeit funktioniert, außer wenn wir die maximal zulässige Einzelbatch-Übertragungsgröße des Auswahlbesitzers (262146 Byte in) überschritten haben dieser Fall). Der Auswahlinhaber gibt uns stattdessen ein actualType von INCR das nicht mit dem angeforderten Typ UTF8_STRING identisch ist. Der Eigentümer möchte Daten inkrementell senden, dh in Blöcken von mehreren XGetWindowProperty s, die UTF8_STRING s enthalten.

Um dies zu lösen, müssen wir der ICCCM-Empfehlung "INCR Properties" folgen. Aber auf den Punkt gebracht:

  1. Holen Sie sich ein Handle für das INCR -atom mit XInternAtom z. B. mit dem Namen INCR_STRING .
  2. Siehe in _glfwGetWindowPropertyX11 wenn wir actualType von INCR_STRING , wenn ja:
    a) Holen Sie sich INCR_STRING mit XGetWindowProperty , es enthält eine niedrigere Übertragungsgrenze.
    b) Löschen Sie diese INCR_STRING -Eigenschaft, damit der Eigentümer uns die guten Sachen schicken kann.
    c) Warten Sie auf ein PropertyNotify -Ereignis, das das Eintreffen eines Teils der vollständigen Daten signalisiert.
    d) Rufen Sie Blockdaten mit XGetWindowProperty und hängen Sie sie an einen Puffer an.
    e) Löschen Sie die Eigenschaft und signalisieren Sie dem Eigentümer, zusätzliche Blöcke zu senden.
    f) Überprüfen Sie, ob die Größe der Daten Null ist, wenn Sie nicht zu c zurückkehren.
    g) Übertragung abgeschlossen, Sie haben jetzt die gesamten Daten!

Wenn Sie interessiert sind, finden Sie hier eine halbfertige Übersicht über die inkrementelle Auswahl, die ich geschrieben habe.
Hier sind einige Links, die ich bei der Untersuchung des Problems als nützlich empfunden habe:

Hoffentlich nützt das jemandem etwas, ich konnte es leider nicht selbst herausfinden.

Danke, das ist eine hervorragende Beschreibung! Es ist ein wenig absurd, was Kunden tun müssen, um Dinge zu erreichen, die ein paar Funktionsaufrufe auf anderen Plattformen sind.

Ich habe vor zwei Tagen mit der Implementierung von INCR begonnen. Ich habe sowohl Lesearbeit als auch Konvertierung von STRING / Latin-1, hatte aber einen kurzen Moment der Verzweiflung, als mir klar wurde, dass INCR, MULTIPLE und STRING zum Schreiben kombiniert werden können. Einige Umstrukturierungen sind angebracht, bevor diese sauber umgesetzt werden können.

Ich habe es gerade in den Zweig selection-fixes geschoben, wenn jemand einen Blick darauf werfen möchte.

Ich muss mich für eine Weile auf Pull Request Reviews konzentrieren. Ich habe viel feinen Code auf eine beschämende Zeit warten lassen. Wenn jemand in der Zwischenzeit weiter daran arbeiten möchte, basierend auf dem obigen Code oder nicht, tun Sie dies bitte.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen