توجيه الإدخال

في نظام Android 9 والإصدارات الأقدم، لم تكن هناك طريقة للتفاعل مع شاشات عرض متعددة عبر اللمس، لأنه لم تكن هناك آلية ارتباط بين شاشات العرض وأجهزة الإدخال. على سبيل المثال، يمكن لشاشة تعمل باللمس أن توفر مخرج فيديو HDMI (الذي يمكن تسجيله كشاشة عرض على Android) ومخرج USB لشاشة اللمس (الذي يمكن تسجيله كجهاز إدخال). إذا تم توصيل أجهزة متعددة بهذه الطريقة، فلن تكون هناك طريقة لتحديد جهاز الإدخال الذي ينتمي إلى أي شاشة. تنطبق نفس المشكلة على الأجهزة القابلة للطي المزودة بشاشات عرض مدمجة متعددة.

أضاف Android 10 آلية لتحديد أجهزة الإدخال التي تنتمي إلى أي شاشات. يتم الارتباط عن طريق أرقام المنافذ حيث يشير المنفذ إلى المنفذ الفعلي الذي تتصل به الشاشة.

على سبيل المثال، إذا كان جهاز Android يحتوي على منفذي HDMI يحملان اسم hdmi1 و hdmi2 ، فقد تكون قيم منفذ العرض 1 و 2 . تظل قيم المنافذ كما هي حتى عند توصيل شاشة عرض مختلفة (مثل طراز عرض مختلف أو شركة مصنعة) بنفس منفذ HDMI الفعلي. وهذا يمكّن الشركات المصنعة للأجهزة من تقديم تعليمات لتجميع شاشات العرض وترقيتها.

تم تكوين الارتباط في /vendor/etc/input-port-associations.xml . على سبيل المثال:

<ports>
    <port display="0" input="usb-xhci-hcd.0.auto-1.1/input0" />
    <port display="1" input="usb-xhci-hcd.0.auto-1.2/input0" />
</ports>

في المثال أعلاه، يحدد display="0" المنفذ الذي تتصل به الشاشة. يحدد input="usb-xhci-hcd.0.auto-1.1/input0" المنفذ الذي يتصل به جهاز الإدخال. لتحديد المنافذ المرتبطة بأجهزة معينة، استخدم الأمر الطرفي التالي، ثم قم بمراجعة خاصية location لتلك الأجهزة في حالة مركز الأحداث.

adb shell dumpsys input

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

لتحديد منافذ العرض المخصصة لشاشات العرض المتصلة، استخدم adb shell dumpsys display ثم ابحث عن خاصية address DisplayDeviceInfo لكل شاشة عرض ضمن أجهزة العرض. وبدلاً من ذلك، استخدم adb shell dumpsys SurfaceFlinger --display-id لتفريغ معلومات التعريف لجميع شاشات العرض المتصلة. انظر أيضًا معرفات العرض الثابتة .

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

التوجيه للشاشات المتعددة الديناميكية

يمكّنك Android 10 من إعداد أجهزة ثابتة متعددة الشاشات. لم يتم تمكين الارتباطات الديناميكية بعد. ومع ذلك، يمكن معالجة بعض حالات الاستخدام من خلال توفير معلومات التوجيه لشاشات العرض ولوحات الإدخال التي لا تكون موجودة دائمًا أو باستخدام أجهزة الإدخال الافتراضية ثم توفير معلومات توجيه إضافية لتلك الأجهزة الافتراضية. إذا كان تطبيق الجهاز يدعم:

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

تطبيق

  • بالنسبة للأجهزة المادية، يتم استخدام المنفذ الذي يتصل به جهاز الإدخال والمنفذ الذي تتصل به شاشة العرض لمطابقة شاشات العرض مع شاشات اللمس.
  • يتم تخزين التعيينات في InputReaderConfiguration .
  • تم تعيين TouchInputMapper.mViewport على منفذ العرض الذي يطابق المنفذ المحدد لـ InputDevice.location .
  • إذا تم تحديد منفذ جهاز إدخال في ملف التعيين، ولا يوجد حاليًا منفذ عرض يحتوي على منفذ عرض مطابق، فسيتم تعطيل جهاز الإدخال الموجود على ذلك المنفذ.
  • إذا لم يتم تحديد منفذ لجهاز إدخال معين، فسيتم تعيين منفذ العرض وفقًا للقواعد الموجودة.
  • ليست هناك حاجة إلى تغييرات kernel في برامج تشغيل الإدخال.
  • يتم تحديد منافذ جهاز الإدخال باستخدام EVIOCGPHYS ioctl.