あなたがでこれをREPROできるクリップボードアプリ、ここでのフォルダのテストから26214 バイトのジャンクファイルは、それのすべてをコピーして、ウィンドウに貼り付ける、あなたが得られます。
Error: X11: Failed to convert selection to string
Clipboard does not contain a string
GLFWは、インクリメンタルクリップボードデータ転送をまだサポートしていません。
自己メモ: UTF8_STRING
私はこれを自分で調べていましたが、実装を完了することができませんでした。 うまくいけば、それを実装しようとした経験の一部が、同じことをしようとしている他の誰かに役立つかもしれません。 一言で言えば、これが何が起こり、ICCCMがこのINCRアトムを処理するために私たちに何を期待するかです:
以下では、 _glfwPlatformGetClipboardString
呼び出すと、X11が非常に悲しくなります。
if (_glfwGetWindowPropertyX11(event.xselection.requestor,
event.xselection.property,
event.xselection.target,
(unsigned char**) &data))
_glfw.x11.clipboardString = strdup(data);
その理由は、タイプUTF8_STRING
event.xselection.target
を要求しているためです。これは、選択所有者の最大許容シングルバッチ転送サイズ(262146バイトこの場合)。 選択の所有者ではなく、私たちに与えるだろうactualType
のINCR
要求された型と同じではありませんこれはUTF8_STRING
。 所有者は、データを段階的に送信したいと考えていUTF8_STRING
を含むいくつかのXGetWindowProperty
のチャンクで送信します。
これを解決するには、ICCCMの推奨事項「INCRプロパティ」に従う必要があります。 しかし、一言で言えば:
XInternAtom
を使用してINCR
-atomへのハンドルを取得します(例: INCR_STRING
。INCR_STRING
actualType
を受け取ったかどうか、 _glfwGetWindowPropertyX11
参照してください。受け取った場合は、次のようになります。XGetWindowProperty
を使用してINCR_STRING
をフェッチします。これには、転送の下限が含まれています。INCR_STRING
プロパティを削除して、所有者が良いものを送ってくれるようにします。PropertyNotify
イベントを待ち、完全なデータのチャンクの到着を通知します。XGetWindowProperty
を使用してチャンクデータを取得し、バッファに追加します。興味があれば、これが私が書いたインクリメンタルセレクションの半分完了した実装の要点です。
問題を調査するときに役立つと思ったリンクをいくつか示します。
うまくいけば、これは誰かの役に立つでしょう、残念ながら私はそれを自分で理解することができませんでした。
ありがとう、それは素晴らしい説明です! 他のプラットフォームでのいくつかの関数呼び出しであるものを達成するためにクライアントが行う必要があることは少しばかげています。
私は2日前にINCRの実装を開始しました。 私は読み取り作業とSTRING / Latin-1からの変換を行っていますが、INCR、MULTIPLE、およびSTRINGを組み合わせて書き込みできることに気付いたとき、少し絶望しました。 それがきれいに実行される前に、いくつかの再構築が必要です。
誰かが覗き見したい場合は、今すぐselection-fixes
ブランチにプッシュしました。
しばらくの間、プルリクエストのレビューに集中する必要があります。 私は恥ずべき時間の間、たくさんのすばらしいコードを待っていました。 上記のコードに基づいているかどうかにかかわらず、当面の間、誰かがこれに取り組み続けたい場合は、そうしてください。
最も参考になるコメント
私はこれを自分で調べていましたが、実装を完了することができませんでした。 うまくいけば、それを実装しようとした経験の一部が、同じことをしようとしている他の誰かに役立つかもしれません。 一言で言えば、これが何が起こり、ICCCMがこのINCRアトムを処理するために私たちに何を期待するかです:
以下では、
_glfwPlatformGetClipboardString
呼び出すと、X11が非常に悲しくなります。その理由は、タイプ
UTF8_STRING
event.xselection.target
を要求しているためです。これは、選択所有者の最大許容シングルバッチ転送サイズ(262146バイトこの場合)。 選択の所有者ではなく、私たちに与えるだろうactualType
のINCR
要求された型と同じではありませんこれはUTF8_STRING
。 所有者は、データを段階的に送信したいと考えていUTF8_STRING
を含むいくつかのXGetWindowProperty
のチャンクで送信します。これを解決するには、ICCCMの推奨事項「INCRプロパティ」に従う必要があります。 しかし、一言で言えば:
XInternAtom
を使用してINCR
-atomへのハンドルを取得します(例:INCR_STRING
。INCR_STRING
actualType
を受け取ったかどうか、_glfwGetWindowPropertyX11
参照してください。受け取った場合は、次のようになります。a)
XGetWindowProperty
を使用してINCR_STRING
をフェッチします。これには、転送の下限が含まれています。b)この
INCR_STRING
プロパティを削除して、所有者が良いものを送ってくれるようにします。c)
PropertyNotify
イベントを待ち、完全なデータのチャンクの到着を通知します。d)
XGetWindowProperty
を使用してチャンクデータを取得し、バッファに追加します。e)プロパティを削除し、所有者に追加のチャンクを送信するように通知します。
f)cにループバックしない場合は、データのサイズがゼロかどうかを確認します。
g)転送が完了しました。これで、データ全体が完成しました。
興味があれば、これが私が書いたインクリメンタルセレクションの半分完了した実装の要点です。
問題を調査するときに役立つと思ったリンクをいくつか示します。
うまくいけば、これは誰かの役に立つでしょう、残念ながら私はそれを自分で理解することができませんでした。