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
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:
INCR
-atom mit XInternAtom
z. B. mit dem Namen INCR_STRING
._glfwGetWindowPropertyX11
wenn wir actualType
von INCR_STRING
, wenn ja:INCR_STRING
mit XGetWindowProperty
, es enthält eine niedrigere Übertragungsgrenze.INCR_STRING
-Eigenschaft, damit der Eigentümer uns die guten Sachen schicken kann.PropertyNotify
-Ereignis, das das Eintreffen eines Teils der vollständigen Daten signalisiert.XGetWindowProperty
und hängen Sie sie an einen Puffer an.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.
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:Der Grund dafür ist, dass wir
event.xselection.target
vom TypUTF8_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 einactualType
vonINCR
das nicht mit dem angeforderten TypUTF8_STRING
identisch ist. Der Eigentümer möchte Daten inkrementell senden, dh in Blöcken von mehrerenXGetWindowProperty
s, dieUTF8_STRING
s enthalten.Um dies zu lösen, müssen wir der ICCCM-Empfehlung "INCR Properties" folgen. Aber auf den Punkt gebracht:
INCR
-atom mitXInternAtom
z. B. mit dem NamenINCR_STRING
._glfwGetWindowPropertyX11
wenn wiractualType
vonINCR_STRING
, wenn ja:a) Holen Sie sich
INCR_STRING
mitXGetWindowProperty
, 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.