مسیریابی ورودی

در اندروید 9 و پایین تر، هیچ راهی برای تعامل با چندین نمایشگر از طریق لمس وجود نداشت، زیرا هیچ مکانیزم ارتباطی بین نمایشگرها و دستگاه های ورودی وجود نداشت. به عنوان مثال، یک صفحه نمایش لمسی می تواند یک خروجی ویدیوی HDMI (که به عنوان نمایشگر در اندروید ثبت می شود) و یک خروجی USB برای صفحه نمایش لمسی (که به عنوان یک دستگاه ورودی ثبت می شود) ارائه دهد. اگر چندین دستگاه به این روش متصل شده باشند، هیچ راهی برای تعیین اینکه کدام دستگاه ورودی متعلق به کدام نمایشگر است وجود نخواهد داشت. همین مسئله در مورد دستگاه های تاشو با نمایشگرهای داخلی متعدد نیز صدق می کند.

اندروید 10 مکانیزمی را اضافه کرد تا مشخص کند کدام دستگاه ورودی متعلق به کدام نمایشگر است. ارتباط توسط شماره پورت انجام می شود که در آن پورت به پورت فیزیکی که نمایشگر به آن متصل است اشاره دارد.

به عنوان مثال، اگر یک دستگاه اندرویدی دارای دو درگاه 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 State بررسی کنید.

adb shell dumpsys input

اگر دستگاه‌های زیادی متصل هستند، روی یک دستگاه خاص ضربه بزنید تا آرایه RecentQueue در وضعیت توزیع ورودی بررسی شود. سپس می توانید دستگاه هایی را که جدیدترین رویداد را ایجاد کرده اند شناسایی کنید. سپس می توانید دستگاه مربوطه را در Event Hub State پیدا کنید.

برای تعیین پورت های نمایشی اختصاص داده شده به نمایشگرهای متصل، از adb shell dumpsys display استفاده کنید و سپس به دنبال ویژگی address DisplayDeviceInfo برای هر نمایشگر در قسمت Display Devices بگردید. روش دیگر، از adb shell dumpsys SurfaceFlinger --display-id برای تخلیه اطلاعات شناسایی برای همه نمایشگرهای متصل استفاده کنید. همچنین به شناسه های نمایشگر استاتیک مراجعه کنید.

اگر ارتباطی را برای یک دستگاه ورودی خاص مشخص کنید و نمایشگر مربوطه در سیستم وجود نداشته باشد، دستگاه ورودی غیرفعال می شود تا زمانی که نمایشگر مربوطه ظاهر شود. ارتباط فقط برای دستگاه های لمسی انجام می شود.

مسیریابی برای چند نمایشگر پویا

اندروید 10 به شما امکان می‌دهد دستگاه‌های چند صفحه‌نمایش ثابت را تنظیم کنید. پیوندهای پویا هنوز فعال نشده اند. با این حال، برخی از موارد استفاده را می توان با ارائه اطلاعات مسیریابی برای نمایشگرها و پانل های ورودی که همیشه وجود ندارند یا با استفاده از دستگاه های ورودی مجازی و سپس ارائه اطلاعات مسیریابی اضافی به آن دستگاه های مجازی، برطرف کرد. اگر پیاده سازی دستگاه از یک زیر پشتیبانی کند:

  • تجربه ای شبیه به دسکتاپ با یک ایستگاه اتصال، سپس یک پیکربندی مسیریابی می تواند برای هدف قرار دادن ورودی از لوازم جانبی ورودی متصل به داک (که منحصراً توسط پورت شناسایی می شود) به صفحه نمایش خارجی (شناسایی شده توسط پورت) ارائه شود.
  • صفحه اصلی که به عنوان منبع ورودی (مانند پد لمسی) در هنگام اتصال به صفحه نمایش خارجی عمل می کند، سپس یک پیکربندی مسیریابی می تواند برای هدف قرار دادن ورودی از پنل لمسی مجازی (شناسایی شده توسط شناسه مجازی منحصر به فرد) به صفحه نمایش خارجی (شناسایی شده توسط پورت) ارائه شود. .

پیاده سازی

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