Vous pouvez reproduire cela avec l' application de un fichier indésirable de 26214 octets , copiez-le tout et collez-le dans la fenêtre, vous obtiendrez:
Error: X11: Failed to convert selection to string
Clipboard does not contain a string
GLFW ne prend pas encore en charge le transfert de données incrémentiel du presse-papiers.
Note à moi-même: UTF8_STRING
J'ai étudié cela moi-même mais je n'ai pas été en mesure de terminer sa mise en œuvre. Espérons qu'une partie de l'expérience en essayant de l'implémenter pourrait être utile à quelqu'un d'autre essayant de faire de même. En un mot, voici ce qui se passe et ce que ICCCM attend de nous pour gérer cet atome INCR:
Ci-dessous, lorsque vous appelez _glfwPlatformGetClipboardString
c'est là que X11 devient très triste:
if (_glfwGetWindowPropertyX11(event.xselection.requestor,
event.xselection.property,
event.xselection.target,
(unsigned char**) &data))
_glfw.x11.clipboardString = strdup(data);
Et la raison est que nous demandons event.xselection.target
de type UTF8_STRING
, qui fonctionnera la plupart du temps, sauf lorsque nous avons dépassé la taille de transfert par lot maximale autorisée par le propriétaire de la sélection (262146 octets dans ce cas). Le propriétaire de la sélection nous donnera à la place un actualType
de INCR
qui n'est pas le même que le type demandé UTF8_STRING
. Le propriétaire souhaite envoyer des données de manière incrémentielle , c'est-à-dire par blocs de plusieurs XGetWindowProperty
s contenant des UTF8_STRING
s.
Pour résoudre ce problème, nous devons suivre la recommandation ICCCM "Propriétés INCR". Mais en un mot:
INCR
-atom avec XInternAtom
par exemple avec le nom INCR_STRING
._glfwGetWindowPropertyX11
si nous avons reçu actualType
sur INCR_STRING
, si oui:INCR_STRING
utilisant XGetWindowProperty
, il contient une limite de transfert inférieure.INCR_STRING
pour que le propriétaire puisse commencer à nous envoyer les bonnes choses.PropertyNotify
, signalant l'arrivée d'un morceau des données complètes.XGetWindowProperty
, ajoutez-les à un tampon.Si vous êtes intéressé, voici l' essentiel de la
Voici quelques liens que j'ai trouvés utiles lors de l'examen du problème:
J'espère que c'est utile à quelqu'un, je n'ai malheureusement pas pu le comprendre moi-même.
Merci, c'est une excellente description! C'est un peu absurde ce que les clients doivent faire pour accomplir des choses qui sont quelques appels de fonction sur d'autres plates-formes.
J'ai commencé à mettre en œuvre l'INCR il y a deux jours. Je travaille en lecture, ainsi que la conversion de STRING / Latin-1, mais j'ai eu un bref moment de désespoir quand j'ai réalisé que INCR, MULTIPLE et STRING peuvent se combiner pour l'écriture. Une certaine restructuration est nécessaire avant que cela puisse être mis en œuvre proprement.
Je l'ai poussé tout à l'heure dans la branche selection-fixes
si quelqu'un veut un aperçu.
Je dois me concentrer sur les examens des demandes de tirage pendant un certain temps. J'ai gardé beaucoup de bons codes en attente pendant un laps de temps honteux. Si quelqu'un souhaite continuer à travailler dessus en attendant, en fonction du code ci-dessus ou non, veuillez le faire.
Commentaire le plus utile
J'ai étudié cela moi-même mais je n'ai pas été en mesure de terminer sa mise en œuvre. Espérons qu'une partie de l'expérience en essayant de l'implémenter pourrait être utile à quelqu'un d'autre essayant de faire de même. En un mot, voici ce qui se passe et ce que ICCCM attend de nous pour gérer cet atome INCR:
Ci-dessous, lorsque vous appelez
_glfwPlatformGetClipboardString
c'est là que X11 devient très triste:Et la raison est que nous demandons
event.xselection.target
de typeUTF8_STRING
, qui fonctionnera la plupart du temps, sauf lorsque nous avons dépassé la taille de transfert par lot maximale autorisée par le propriétaire de la sélection (262146 octets dans ce cas). Le propriétaire de la sélection nous donnera à la place unactualType
deINCR
qui n'est pas le même que le type demandéUTF8_STRING
. Le propriétaire souhaite envoyer des données de manière incrémentielle , c'est-à-dire par blocs de plusieursXGetWindowProperty
s contenant desUTF8_STRING
s.Pour résoudre ce problème, nous devons suivre la recommandation ICCCM "Propriétés INCR". Mais en un mot:
INCR
-atom avecXInternAtom
par exemple avec le nomINCR_STRING
._glfwGetWindowPropertyX11
si nous avons reçuactualType
surINCR_STRING
, si oui:a) Récupérez
INCR_STRING
utilisantXGetWindowProperty
, il contient une limite de transfert inférieure.b) Supprimez cette propriété
INCR_STRING
pour que le propriétaire puisse commencer à nous envoyer les bonnes choses.c) Attendez un événement
PropertyNotify
, signalant l'arrivée d'un morceau des données complètes.d) Récupérez les données de bloc en utilisant
XGetWindowProperty
, ajoutez-les à un tampon.e) Supprimer la propriété, signalant au propriétaire d'envoyer des blocs supplémentaires.
f) Vérifiez si la taille des données est égale à zéro, sinon retournez à c.
g) Transfert terminé, vous avez maintenant toutes les données!
Si vous êtes intéressé, voici l' essentiel de la
Voici quelques liens que j'ai trouvés utiles lors de l'examen du problème:
J'espère que c'est utile à quelqu'un, je n'ai malheureusement pas pu le comprendre moi-même.