ניתוב קלט

ב-Android 9 ובגרסאות קודמות, לא הייתה אפשרות ליצור אינטראקציה עם כמה מסכים באמצעות מגע, כי לא היה מנגנון שיוך בין מסכים לבין מכשירי קלט. לדוגמה, מסך מגע יכול לספק פלט וידאו HDMI (שיירשם כמסך ב-Android) ופלט USB למסך מגע (שיירשם כמכשיר קלט). אם כמה מכשירים מחוברים באופן הזה, אין דרך לקבוע איזה מכשיר קלט שייך לאיזה מסך. אותה בעיה קיימת במכשירים מתקפלים עם כמה מסכים מובנים.

ב-Android 10 נוסף מנגנון שמאפשר לציין אילו מכשירי קלט שייכים לאילו מסכים. השיוך מתבצע לפי מספרי יציאות, כאשר port מתייחס ליציאה הפיזית שאליה מחובר הצג.

לדוגמה, אם למכשיר 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 ב-Input Dispatcher State. לאחר מכן תוכלו לזהות את המכשירים שיצרו את האירוע האחרון. אחר כך תוכלו למצוא את המכשיר המתאים במצב של Event Hub.

כדי לקבוע את יציאות התצוגה שהוקצו למסכים המחוברים, משתמשים בפקודה adb shell dumpsys display ואז מחפשים את המאפיין address של DisplayDeviceInfo לכל מסך בקטע Display Devices (מכשירי תצוגה). אפשר גם להשתמש בפקודה adb shell dumpsys SurfaceFlinger --display-id כדי להציג את פרטי הזיהוי של כל המסכים המחוברים. מידע נוסף זמין במאמר בנושא מזהים של תצוגות סטטיות.

אם מציינים שיוך למכשיר קלט ספציפי והתצוגה המתאימה לא קיימת במערכת, מכשיר הקלט מושבת עד שהתצוגה הרלוונטית מופיעה. השיוך מתבצע רק במכשירי מגע.

ניתוב של מודעות דינמיות לרשת המדיה בכמה גדלים

ב-Android 10 אפשר להגדיר מכשירים עם תצוגה סטטית מרובת מסכים. עדיין לא הפעלנו שיוכים דינמיים. עם זאת, אפשר לטפל בחלק מתרחישי השימוש על ידי מתן פרטי ניתוב למסכים וללוחות קלט שלא תמיד מוצגים, או על ידי שימוש במכשירי קלט וירטואליים ומתן פרטי ניתוב נוספים למכשירים הווירטואליים האלה. אם הטמעה של מכשיר תומכת ב:

  • חוויה שדומה לשימוש במחשב שולחני עם תחנת עגינה, ואז אפשר לספק הגדרת ניתוב כדי לכוון את הקלט מאביזר קלט שמחובר לתחנת העגינה (מזוהה באופן ייחודי לפי יציאה) לתצוגה החיצונית (מזוהה לפי יציאה).
  • המסך הראשי פועל כמקור קלט (כמו משטח מגע) כשהוא מחובר למסך חיצוני, ואז אפשר לספק הגדרת ניתוב כדי לכוון את הקלט מלוח מגע וירטואלי (שמזוהה באמצעות מזהה וירטואלי ייחודי) למסך החיצוני (שמזוהה באמצעות יציאה).

הטמעה

  • במכשירים פיזיים, היציאה שאליה מחובר מכשיר הקלט והיציאה שאליה מחובר המסך משמשות להתאמת המסכים למסכי מגע.
  • המיפויים מאוחסנים ב-InputReaderConfiguration.
  • TouchInputMapper.mViewport מוגדר לאזור התצוגה שתואם ליציאה שצוינה עבור InputDevice.location.
  • אם יציאה של מכשיר קלט מצוינת בקובץ המיפוי, ואין כרגע אזור תצוגה עם יציאת תצוגה תואמת, מכשיר הקלט ביציאה הזו מושבת.
  • אם לא מציינים יציאה למכשיר קלט מסוים, אזור התצוגה מוגדר בהתאם לכללים הקיימים.
  • אין צורך לבצע שינויים בקרנל במנהלי ההתקנים של הקלט.
  • יציאות מכשירי הקלט נקבעות באמצעות EVIOCGPHYS ioctl.