> On Jan 13, 2015, at 9:15 AM, William Orr <w...@worrbase.com> wrote:
> 
> Hey, any interest?
> 
> On 12/12/2014 08:29 PM, William Orr wrote:
>> Hey,
>> 
>> On some macbook airs, the function keys have different functionality when the
>> Fn key is pressed. I've added an additional munge function to handle these
>> particular cases.
>> 
>> Thanks,
>> William Orr
>> 
>> Index: sys/dev/usb/ukbd.c
>> ===================================================================
>> RCS file: /cvs/src/sys/dev/usb/ukbd.c,v
>> retrieving revision 1.69
>> diff -u -b -w -p -r1.69 ukbd.c
>> --- sys/dev/usb/ukbd.c       11 Dec 2014 18:39:27 -0000      1.69
>> +++ sys/dev/usb/ukbd.c       13 Dec 2014 04:18:55 -0000
>> @@ -180,6 +180,7 @@ struct ukbd_translation {
>> void ukbd_gdium_munge(void *, uint8_t *, u_int);
>> #endif
>> void ukbd_apple_munge(void *, uint8_t *, u_int);
>> +void        ukbd_apple_mba_munge(void *, uint8_t *, u_int);
>> void ukbd_apple_iso_munge(void *, uint8_t *, u_int);
>> uint8_t      ukbd_translate(const struct ukbd_translation *, size_t, 
>> uint8_t);
>> 
>> @@ -244,13 +245,29 @@ ukbd_attach(struct device *parent, struc
>>              if (hid_locate(desc, dlen, HID_USAGE2(HUP_APPLE, HUG_FN_KEY),
>>                  uha->reportid, hid_input, &sc->sc_apple_fn, &qflags)) {
>>                      if (qflags & HIO_VARIABLE) {
>> +                            /* Older Macbook Air's have different fn key 
>> layouts */
Not sure that comment belongs here
>>                              if (iso)
>>                                      sc->sc_munge = ukbd_apple_iso_munge;
>> -                            else
>> +                            else {
>> +                                    switch (uha->uaa->product) {
>> +                                            case 
>> USB_PRODUCT_APPLE_WELLSPRING4A_ANSI:
>> +                                            case 
>> USB_PRODUCT_APPLE_WELLSPRING4A_ISO:
>> +                                            case 
>> USB_PRODUCT_APPLE_WELLSPRING4A_JIS:
>> +                                            case 
>> USB_PRODUCT_APPLE_WELLSPRING4_ANSI:
>> +                                            case 
>> USB_PRODUCT_APPLE_WELLSPRING4_ISO:
>> +                                            case 
>> USB_PRODUCT_APPLE_WELLSPRING4_JIS:
>> +                                            case 
>> USB_PRODUCT_APPLE_WELLSPRING_ANSI:
>> +                                            case 
>> USB_PRODUCT_APPLE_WELLSPRING_ISO:
>> +                                            case 
>> USB_PRODUCT_APPLE_WELLSPRING_JIS:
Any special remaping for *ISO (e.g. one that was done for FOUNTAIN_ISO and 
GEYSER_ISO)?
Remaping for JIS?
>> +                                                    sc->sc_munge = 
>> ukbd_apple_mba_munge;
>> +                                                    break;
>> +                                            default:
>>                                      sc->sc_munge = ukbd_apple_munge;
That  code probably can be restructured to support multiple types (ISO, JIS and 
ANSI) for multiple keyboard versions (WELLSPRING*/FOUNTAIN/GEYSER)
>>                      }
>>              }
>>      }
>> +            }
>> +    }
>> 
>>      if (uha->uaa->vendor == USB_VENDOR_TOPRE &&
>>          uha->uaa->product == USB_PRODUCT_TOPRE_HHKB) {
>> @@ -478,6 +495,52 @@ ukbd_apple_munge(void *vsc, uint8_t *ibu
>>              { 67, 127 },    /* F10 -> audio mute */
>>              { 68, 129 },    /* F11 -> audio lower */
>>              { 69, 128 },    /* F12 -> audio raise */
>> +#endif
>> +            { 79, 77 },     /* right -> end */
>> +            { 80, 74 },     /* left -> home */
>> +            { 81, 78 },     /* down -> page down */
>> +            { 82, 75 }      /* up -> page up */
>> +    };
>> +
>> +    if (!hid_get_data(ibuf, ilen, &sc->sc_apple_fn))
>> +            return;
>> +
>> +    spos = ibuf + kbd->sc_keycodeloc.pos / 8;
>> +    epos = spos + kbd->sc_nkeycode;
>> +
>> +    for (pos = spos; pos != epos; pos++) {
>> +            xlat = ukbd_translate(apple_fn_trans,
>> +                nitems(apple_fn_trans), *pos);
>> +            if (xlat != 0)
>> +                    *pos = xlat;
>> +    }
there are 3 instances of similar code there now. maybe should be moved to a 
function.
>> +}
>> +
>> +void
>> +ukbd_apple_mba_munge(void *vsc, uint8_t *ibuf, u_int ilen)
>> +{
>> +    struct ukbd_softc *sc = vsc;
>> +    struct hidkbd *kbd = &sc->sc_kbd;
>> +    uint8_t *pos, *spos, *epos, xlat;
>> +
>> +    static const struct ukbd_translation apple_fn_trans[] = {
apple_fn_mba_trans?
>> +            { 40, 73 },     /* return -> insert */
>> +            { 42, 76 },     /* backspace -> delete */
>> +#ifdef notyet
>> +            { 58, 0 },      /* F1 -> screen brightness down */
>> +            { 59, 0 },      /* F2 -> screen brightness up */
>> +            { 60, 0 },      /* F3 */
>> +            { 61, 0 },      /* F4 */
>> +            { 62, 0 },      /* F5 */
>> +            { 63, 0 },      /* F6 -> audio back */
>> +            { 64, 0 },      /* F7 -> audio pause/play */
>> +            { 65, 0 },      /* F8 -> audio next */
>> +#endif
>> +            { 66, 127 },    /* F9 -> audio mute */
>> +            { 67, 129 },    /* F10 -> audio lower */
>> +            { 68, 128 },    /* F11 -> audio raise */
>> +#ifdef notyet
>> +            { 69, 0 },      /* F12 -> eject */
>> #endif
>>              { 79, 77 },     /* right -> end */
>>              { 80, 74 },     /* left -> home */
>> 
> 

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to