هدایت ورودی

در 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 به شما امکان می‌دهد دستگاه‌های چندنمایشگری ثابت را راه‌اندازی کنید. وابستگی‌های پویا هنوز فعال نشده است. بااین‌حال، برخی موارد استفاده را می‌توان با ارائه اطلاعات مسیریابی برای نمایشگرها و پانل‌های ورودی که همیشه وجود ندارند یا بااستفاده از دستگاه‌های ورودی مجازی و سپس ارائه اطلاعات مسیریابی اضافی به آن دستگاه‌های مجازی برطرف کرد. اگر پیاده‌سازی دستگاه از موارد زیر پشتیبانی کند:

  • تجربه‌ای شبیه رایانه با ایستگاه اتصال، سپس پیکربندی مسیریابی می‌تواند برای هدف‌یابی ورودی از لوازم جانبی ورودی متصل به ایستگاه اتصال (با شناسه یکتای درگاه) به نمایشگر خارجی (با شناسه درگاه) ارائه شود.
  • Primary screen acting as an input source (such as a touchpad) when connected to the external display, then a routing config could be provided to target input from virtual touch panel (identified by unique virtual ID) to the external display (identified by port).

پیاده‌سازی

  • برای دستگاه‌های فیزیکی، از درگاهی که دستگاه ورودی به آن متصل است و درگاهی که نمایشگر به آن متصل است برای مطابقت دادن نمایشگرها با صفحه‌های لمسی استفاده می‌شود.
  • این نگاشت‌ها در InputReaderConfiguration ذخیره می‌شوند.
  • ‫TouchInputMapper.mViewport روی ناحیه نمایشی تنظیم شده است که با درگاه مشخص‌شده برای InputDevice.location مطابقت دارد.
  • اگر درگاه دستگاه ورودی در فایل نگاشت مشخص شده باشد و درحال‌حاضر نمای دیدی وجود نداشته باشد که درگاه نمایشگر منطبقی داشته باشد، دستگاه ورودی در آن درگاه غیرفعال می‌شود.
  • اگر درگاهی برای دستگاه ورودی خاصی مشخص نشده باشد، درگاه دید براساس قوانین موجود تنظیم می‌شود.
  • هیچ تغییری در هسته درایورهای ورودی لازم نیست.
  • درگاه‌های دستگاه ورودی بااستفاده از EVIOCGPHYS ioctl تعیین می‌شوند.