ניתוב קלט

ב-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 במצב מתקן הקלט. לאחר מכן תוכלו לזהות המכשירים שבהם נוצר האירוע האחרון. עכשיו אפשר למצוא את המכשיר התואם במצב 'מרכז האירועים'.

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

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

ניתוב במסכים מרובים דינמיים

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

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

הטמעה

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