ניתוב קלט

ב-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 של המכשירים האלה במצב מרכז האירועים.

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