ניתוב קלט

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

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

לדוגמה, אם למכשיר Android יש שתי יציאות HDMI עם התוויות hdmi1 ו-hdmi2, הערכים של DisplayPort יכולים להיות 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.
  • אם יציאה של מכשיר קלט צוינה בקובץ המיפוי, ואין כרגע אזור תצוגה עם יציאת תצוגה תואמת, מכשיר הקלט ביציאה הזו יושבת.
  • אם לא צוין יציאה למכשיר קלט מסוים, אזור התצוגה מוגדר בהתאם לכללים הקיימים.
  • אין צורך לבצע שינויים בליבה במנהלי הקלט.
  • היציאות של מכשיר הקלט נקבעות באמצעות ה-ioctl‏ EVIOCGPHYS.