ניתוב קלט

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