Glfw: Ajout de la prise en charge du transfert incrémentiel des sélections

Créé le 15 avr. 2014  ·  5Commentaires  ·  Source: glfw/glfw

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
X11 bug verified

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:

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:

  1. Obtenez un handle vers le INCR -atom avec XInternAtom par exemple avec le nom INCR_STRING .
  2. Voir dans _glfwGetWindowPropertyX11 si nous avons reçu actualType sur INCR_STRING , si oui:
    a) Récupérez INCR_STRING utilisant XGetWindowProperty , 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.

Tous les 5 commentaires

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:

  1. Obtenez un handle vers le INCR -atom avec XInternAtom par exemple avec le nom INCR_STRING .
  2. Voir dans _glfwGetWindowPropertyX11 si nous avons reçu actualType sur INCR_STRING , si oui:
    a) Récupérez INCR_STRING utilisant XGetWindowProperty , 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.

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.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

GraemeWilde picture GraemeWilde  ·  3Commentaires

Itanq picture Itanq  ·  5Commentaires

ifschleife picture ifschleife  ·  5Commentaires

christianparpart picture christianparpart  ·  4Commentaires

elmindreda picture elmindreda  ·  4Commentaires