קובצי פריסה של מפתחות

קובצי פריסה של מפתחות (קבצי .kl) ממפים קודי מפתחות ואקסים של Linux לקודי מפתחות ואקסים של Android, ומציינים את דגלי המדיניות המשויכים. קבצים של פריסות מפתחות ספציפיות למכשיר הם:

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

אם אין קובץ פריסת מפתחות ספציפי למכשיר, המערכת בוחרת ברירת מחדל במקום זאת.

מיקום

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

  • /odm/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
  • /vendor/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
  • /system/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
  • /data/system/devices/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
  • /odm/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
  • /vendor/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
  • /system/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
  • /data/system/devices/keylayout/Vendor_XXXX_Product_XXXX.kl
  • /odm/usr/keylayout/DEVICE_NAME.kl
  • /vendor/usr/keylayout/DEVICE_NAME.kl
  • /system/usr/keylayout/DEVICE_NAME.kl
  • /data/system/devices/keylayout/DEVICE_NAME.kl
  • /odm/usr/keylayout/Generic.kl
  • /vendor/usr/keylayout/Generic.kl
  • /system/usr/keylayout/Generic.kl
  • /data/system/devices/keylayout/Generic.kl

כשיוצרים נתיב קובץ שמכיל את שם המכשיר, כל התווים בשם המכשיר מלבד '0'-'9', 'a'-'z', 'A'-'Z', '-' או '_' מוחלפים ב-'_'.

קובץ פריסת מפתחות גנרי

המערכת מספקת קובץ פריסת מפתחות גנרי מובנה מיוחד שנקרא Generic.kl. פריסת המקשים הזו מיועדת לתמוך במגוון של מקלדות חיצוניות רגילות וסטיק שליטה. אין לשנות את הפריסה של המפתח הכללי.

תחביר

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

הצהרות על מפתחות

הצהרות על מפתחות מורכבות ממילת המפתח key ואחריה מספר קוד מפתח של Linux ושם קוד מפתח של Android, או שימוש במילת המפתח ואחריה שימוש ב-HID ושם קוד מפתח של Android. השימוש ב-HID מיוצג כמספר שלם של 32 ביט, כאשר 16 הביט העליונים מייצגים את דף השימוש ב-HID ו-16 הביט התחתונים מייצגים את מזהה השימוש ב-HID. אחרי כל הצהרה יכולה להופיע קבוצה אופציונלית של דגלי מדיניות מופרדים ברווחים לבנים.

key 1     ESCAPE
key 114   VOLUME_DOWN
key 16    Q                 VIRTUAL
key usage 0x0c006F          BRIGHTNESS_UP

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

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

הצהרות על צירים

כל הצהרת ציר מורכבת ממילת המפתח axis ואחריה מספר קוד של ציר Linux ומאפיינים שמאפשרים לשלוט בהתנהגות הציר, כולל שם קוד אחד לפחות של ציר Android.

צירים בסיסיים

ציר בסיסי ממפה קוד ציר של Linux לשם קוד של ציר Android. ההצהרה הבאה ממפה את ABS_X (שמצוין על ידי 0x00) אל AXIS_X (שמצוין על ידי X).

axis 0x00 X

בדוגמה שלמעלה, אם הערך של ABS_X הוא 5, הערך של AXIS_X מוגדר ל-5.

צירים מפוצלים

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

ההצהרה הבאה ממפה ערכים של ציר ABS_Y (שמצוין על ידי 0x01) לערך AXIS_GAS כשהם קטנים מ-0x7f, או לערך AXIS_BRAKE כשהם גדולים מ-0x7f.

axis 0x01 split 0x7f GAS BRAKE

בדוגמה שלמעלה, אם הערך של ABS_Y הוא 0x7d, הערך של AXIS_GAS מוגדר כ-2 (0x7f - 0x7d) והערך של AXIS_BRAKE מוגדר כ-0. לעומת זאת, אם הערך של ABS_Y הוא 0x83, הערך של AXIS_GAS מוגדר כ-0 והערך של AXIS_BRAKE מוגדר כ-4 (0x83 - 0x7f). לבסוף, אם הערך של ABS_Y שווה לערך המפוצל של 0x7f, הערך של AXIS_GAS וגם הערך של AXIS_BRAKE מוגדרים כ-0.

צירים הפוכים

כשהציר הפוך, המשמעות היא שהסימן של ערך הציר הפוך. ההצהרה הבאה ממפה את ABS_RZ (שמצוין על ידי 0x05) אל AXIS_BRAKE (שמצוין על ידי BRAKE), ומהפכת את הפלט על ידי ביטול שלו.

axis 0x05 invert BRAKE

בדוגמה שלמעלה, אם הערך של ABS_RZ הוא 2, הערך של AXIS_BRAKE מוגדר ל--2.

אפשרות 'מרכז שטוח'

מכשיר ג'ויסטיק עשוי לדווח על אירועי קלט גם כשלא משתמשים בג'ויסטיק, בגלל רעש. בדרך כלל, הרעש הזה מגיע מהג'ויסטיק הימני או השמאלי, וגורם לנהג לדווח על ערך מיקום קרוב ל-0. הערך 'center flat' מציין את כמות הרעש הצפויה מהבקר במצב מנוחה.

פרוטוקול הקלט של Linux מספק דרך לנהגים של התקני קלט לציין את הערך השטוח של מרכז הצירים של ג'ויסטיק, אבל לא כל הנהגים מדווחים עליו וחלקם מספקים ערכים שגויים. כדי לפתור את הבעיה הזו, אפשר להוסיף להצהרה על ציר את האפשרות flat שמציינת את רוחב האזור סביב מיקום הציר במרכז, שצריך להיחשב כממורכז.

לדוגמה, אם מנהל התקן של מכשיר מדווח על ערכים של AXIS_X בין 0 ל-100, מערכת הקלט של Android ממפה את הערך 0 לערך -1 ואת הערך 100 לערך 1. מרכז הטווח יהיה 50 בקואורדינטות ללא שינוי קנה מידה ו-0 בקואורדינטות עם שינוי קנה מידה. אם הערך השטוח שווה ל-10, המפתחים צריכים להניח שכל ערך AXIS_X שמדווח בין -0.1 ל-0.1 (בין 40 ל-60 בקואורדינטות ללא שינוי קנה מידה) הוא רעש, ולטפל בערכים האלה שמגיעים מהג'ויסטיק כערך אפס.

הערה: קובץ הפריסה של המפתחות מציין את הערך במרחב הקואורדינטות של הנהג, אבל הערך שמדווח על ידי android.view.InputDevice.MotionRange#getFlat() נמצא במרחב הקואורדינטות של Android.

axis 0x03 Z flat 4096

בדוגמה שלמעלה, הערך הקבוע של המרכז מוגדר כ-4096.

תגובות

שורות הערה מתחילות ב-# וממשיכות עד סוף השורה:

# A comment!

המערכת מתעלמת משורות ריקות.

דוגמאות

מקלדת

# This is an example of a key layout file for a keyboard.

key 1     ESCAPE
key 2     1
key 3     2
key 4     3
key 5     4
key 6     5
key 7     6
key 8     7
key 9     8
key 10    9
key 11    0
key 12    MINUS
key 13    EQUALS
key 14    DEL

# etc...

שליטה במערכת

# This is an example of a key layout file for basic system controls,
# such as volume and power keys which are typically implemented as GPIO pins
# the device decodes into key presses.

key 114   VOLUME_DOWN
key 115   VOLUME_UP
key 116   POWER

לחצנים קיבוליים

# This is an example of a key layout file for a touch device with capacitive buttons.

key 139    MENU           VIRTUAL
key 172    HOME           VIRTUAL
key 158    BACK           VIRTUAL
key 217    SEARCH         VIRTUAL

בקרי מדיה בשקע אוזניות

# This is an example of a key layout file for headset mounted media controls.
# A typical headset jack interface might have special control wires or detect known
# resistive loads as corresponding to media functions or volume controls.
# This file assumes that the driver decodes these signals and reports media
# controls as key presses.

key 163   MEDIA_NEXT
key 165   MEDIA_PREVIOUS
key 226   HEADSETHOOK

ג'ויסטיק

# This is an example of a key layout file for a joystick.

# These are the buttons that the joystick supports, represented as keys.
key 304   BUTTON_A
key 305   BUTTON_B
key 307   BUTTON_X
key 308   BUTTON_Y
key 310   BUTTON_L1
key 311   BUTTON_R1
key 314   BUTTON_SELECT
key 315   BUTTON_START
key 316   BUTTON_MODE
key 317   BUTTON_THUMBL
key 318   BUTTON_THUMBR

# Left and right stick.
# The reported value for flat is 128 in a range of -32767 to 32768, which is absurd.
# This confuses applications that rely on the flat value because the joystick
# actually settles in a flat range of +/- 4096 or so. We override it here.
axis 0x00 X flat 4096
axis 0x01 Y flat 4096
axis 0x03 Z flat 4096
axis 0x04 RZ flat 4096

# Triggers.
axis 0x02 LTRIGGER
axis 0x05 RTRIGGER

# Hat.
axis 0x10 HAT_X
axis 0x11 HAT_Y

מקשים וירטואליים

מערכת הקלט מספקת תכונות מיוחדות להטמעת מקשים וירטואליים בתרחישי השימוש הבאים:

  1. אם המקשים הווירטואליים מוצגים באופן גרפי במסך (למשל ב-Galaxy Nexus), הם מיושמים על ידי הרכיב של סרגל הניווט בחבילת System UI. מאחר שמפתחות וירטואליים גרפיים מוטמעים בשכבה גבוהה במערכת, קבצים של פריסות מפתחות לא נכללים בכך והמידע הבא לא רלוונטי.
  2. אם המקשים הווירטואליים מוטמעים כאזור מגע מורחב שנמצא במסך המגע הראשי (כמו ב-Nexus One), מערכת הקלט משתמשת בקובץ מפת מפתחות וירטואליים כדי לתרגם קואורדינטות מגע X/Y לקודי מפתחות של Linux, ואז משתמשת בקובץ הפריסה של המפתחות כדי לתרגם קודי מפתחות של Linux לקודי מפתחות של Android (פרטים על קובצי מפות מפתחות וירטואליים זמינים במאמר מכשירי מגע). קובץ הפריסה של המפתחות למכשיר הקלט עם מסך המגע חייב לציין את מיפוי המפתחות המתאים ולכלול את הדגל VIRTUAL לכל מקש.
  3. אם המקשים הווירטואליים מוטמעים כלחצנים קיבוליים נפרדים ממסך המגע הראשי (כמו ב-Nexus S), מנהל ההתקן של הליבה או הקושחה אחראים לתרגם את המגעים לקודי מפתחות של Linux, שמערכת הקלט מתרגמת לאחר מכן לקודי מפתחות של Android באמצעות קובץ הפריסה של המפתחות. קובץ הפריסה של המפתחות של מכשיר הקלט עם הלחצן הקינטי חייב לציין את המיפוי המתאים של המפתחות ולכלול את הדגל VIRTUAL לכל מפתח.

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

כדי להפעיל את הדחייה של הקשה על מקש וירטואלי:

  1. מספקים קובץ של פריסת מפתחות למסך המגע או למכשיר הקלט עם הלחצנים הקיבוליים, עם הדגל VIRTUAL מוגדר לכל מפתח.
    key 139    MENU           VIRTUAL
    key 172    HOME           VIRTUAL
    key 158    BACK           VIRTUAL
    key 217    SEARCH         VIRTUAL
    
  2. מגדירים את הערך של זמן השקט של המפתח הווירטואלי בשכבת-על של משאב למשאב config.xml של המסגרת.
    <!-- Specifies the amount of time to disable virtual keys after the screen
    is touched to filter out accidental virtual key presses due to swiping gestures
    or taps near the edge of the display. May be 0 to disable the feature.
    It is recommended that this value be no more than 250 ms.
    This feature should be disabled for most devices. -->
    
    <integer name="config_virtualKeyQuietTimeMillis">250</integer>
    

אימות

צריך לאמת את קובצי הפריסה של המפתחות באמצעות הכלי Validate Keymaps.