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

في الإصدار 9 من نظام التشغيل Android والإصدارات الأقدم، لم تكن هناك طريقة للتفاعل مع شاشات متعددة من خلال اللمس، لأنّه لم تكن هناك آلية ربط بين الشاشات وأجهزة input . على سبيل المثال، يمكن أن توفّر شاشة تعمل باللمس مخرج فيديو 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 لهذه الأجهزة في حالة Event Hub.

adb shell dumpsys input

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

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

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

التوجيه إلى شاشات العرض الديناميكية المتعددة

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

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

التنفيذ

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