Glfw: أضف دعمًا للنقل التدريجي للتحديدات

تم إنشاؤها على ١٥ أبريل ٢٠١٤  ·  5تعليقات  ·  مصدر: glfw/glfw

يمكنك إعادة نسخ هذا باستخدام تطبيق الحافظة من مجلد الاختبارات ، وهنا ملف غير هام بحجم 26214 بايت ، قم بنسخه بالكامل ولصقه في النافذة ، وستحصل على:

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

التعليق الأكثر فائدة

لقد كنت أبحث في هذا بنفسي ولكني لم أتمكن من استكمال تنفيذه. نأمل أن تكون بعض التجارب في محاولة تنفيذه مفيدة لشخص آخر يحاول أن يفعل الشيء نفسه. باختصار ، إليك ما يحدث وما تتوقعه ICCCM منا أن نفعله للتعامل مع ذرة INCR:

أدناه ، عند الاتصال بـ _glfwPlatformGetClipboardString يصبح X11 حزينًا للغاية:

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

والسبب هو أننا نطلب event.xselection.target من النوع UTF8_STRING ، والذي سيعمل في معظم الأوقات ، إلا عندما نجتاز الحد الأقصى المسموح به لحجم النقل أحادي الدفعة لمالك التحديد (262146 بايت في هذه القضية). بدلاً من ذلك ، سيعطينا مالك التحديد مبلغًا actualType من INCR وهو يختلف عن النوع المطلوب UTF8_STRING . يريد المالك إرسال البيانات بشكل متزايد ، على سبيل المثال في مجموعات من عدة XGetWindowProperty s تحتوي على UTF8_STRING s.

لحل هذه المشكلة ، نحتاج إلى اتباع توصية ICCCM "خصائص INCR". لكن باختصار:

  1. احصل على مقبض للذرة INCR مع XInternAtom سبيل المثال بالاسم INCR_STRING .
  2. انظر في _glfwGetWindowPropertyX11 إذا تلقينا actualType من INCR_STRING ، إذا كان الأمر كذلك:
    أ) جلب INCR_STRING باستخدام XGetWindowProperty ، فهو يحتوي على حد نقل أقل.
    ب) احذف هذه الخاصية INCR_STRING حتى يتمكن المالك من البدء في إرسال الأشياء الجيدة إلينا.
    ج) انتظر حدث PropertyNotify ، يشير إلى وصول جزء من البيانات الكاملة.
    د) استرجع البيانات المقطوعة باستخدام XGetWindowProperty ، وألحقها بالمخزن المؤقت.
    هـ) حذف الخاصية ، وإبلاغ المالك بإرسال قطع إضافية.
    و) تحقق مما إذا كان حجم البيانات هو صفر ، إن لم يكن العودة إلى c
    ز) اكتمل النقل ، لديك الآن البيانات الكاملة!

إذا كنت مهتمًا ، فإليك موجز تنفيذ نصف مكتمل للتحديدات المتزايدة التي كتبتها.
إليك بعض الروابط التي وجدتها مفيدة عند النظر في المشكلة:

آمل أن يكون هذا مفيدًا لشخص ما ، لم أتمكن من معرفة ذلك بنفسي لسوء الحظ.

ال 5 كومينتر

لا يدعم 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);

والسبب هو أننا نطلب event.xselection.target من النوع UTF8_STRING ، والذي سيعمل في معظم الأوقات ، إلا عندما نجتاز الحد الأقصى المسموح به لحجم النقل أحادي الدفعة لمالك التحديد (262146 بايت في هذه القضية). بدلاً من ذلك ، سيعطينا مالك التحديد مبلغًا actualType من INCR وهو يختلف عن النوع المطلوب UTF8_STRING . يريد المالك إرسال البيانات بشكل متزايد ، على سبيل المثال في مجموعات من عدة XGetWindowProperty s تحتوي على UTF8_STRING s.

لحل هذه المشكلة ، نحتاج إلى اتباع توصية ICCCM "خصائص INCR". لكن باختصار:

  1. احصل على مقبض للذرة INCR مع XInternAtom سبيل المثال بالاسم INCR_STRING .
  2. انظر في _glfwGetWindowPropertyX11 إذا تلقينا actualType من INCR_STRING ، إذا كان الأمر كذلك:
    أ) جلب INCR_STRING باستخدام XGetWindowProperty ، فهو يحتوي على حد نقل أقل.
    ب) احذف هذه الخاصية INCR_STRING حتى يتمكن المالك من البدء في إرسال الأشياء الجيدة إلينا.
    ج) انتظر حدث PropertyNotify ، يشير إلى وصول جزء من البيانات الكاملة.
    د) استرجع البيانات المقطوعة باستخدام XGetWindowProperty ، وألحقها بالمخزن المؤقت.
    هـ) حذف الخاصية ، وإبلاغ المالك بإرسال قطع إضافية.
    و) تحقق مما إذا كان حجم البيانات هو صفر ، إن لم يكن العودة إلى c
    ز) اكتمل النقل ، لديك الآن البيانات الكاملة!

إذا كنت مهتمًا ، فإليك موجز تنفيذ نصف مكتمل للتحديدات المتزايدة التي كتبتها.
إليك بعض الروابط التي وجدتها مفيدة عند النظر في المشكلة:

آمل أن يكون هذا مفيدًا لشخص ما ، لم أتمكن من معرفة ذلك بنفسي لسوء الحظ.

شكرا لك ، هذا وصف ممتاز! من السخف بعض الشيء ما يحتاج العملاء إلى القيام به لإنجاز الأشياء التي هي عبارة عن عدة استدعاءات وظيفية على منصات أخرى.

لقد بدأت في تنفيذ INCR منذ يومين. لقد عملت في القراءة ، بالإضافة إلى التحويل من STRING / Latin-1 ، لكنني شعرت بلحظة قصيرة من اليأس عندما أدركت أنه يمكن دمج INCR و MULTIPLE و STRING للكتابة. يجب إجراء بعض عمليات إعادة الهيكلة قبل أن يتم تنفيذها بشكل نظيف.

دفعها الآن إلى الفرع selection-fixes إذا أراد أي شخص إلقاء نظرة خاطفة.

أحتاج إلى التركيز على مراجعة طلب السحب لفترة من الوقت. لقد احتفظت بالكثير من التعليمات البرمجية الدقيقة في انتظار فترة مخزية من الوقت. إذا أراد أي شخص مواصلة العمل على هذا في غضون ذلك ، بناءً على الرمز أعلاه أم لا ، فيرجى القيام بذلك.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات