qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] Adding more function keys support


From: Daniel P. Berrange
Subject: Re: [Qemu-devel] Adding more function keys support
Date: Thu, 14 Dec 2017 10:27:13 +0000
User-agent: Mutt/1.9.1 (2017-09-22)

On Wed, Dec 13, 2017 at 02:18:49PM -0500, Programmingkid wrote:
> 
> > On Dec 13, 2017, at 1:22 PM, BALATON Zoltan <address@hidden> wrote:
> > 
> > On Wed, 13 Dec 2017, Programmingkid wrote:
> >>> On Dec 13, 2017, at 4:14 AM, Daniel P. Berrange <address@hidden> wrote:
> >>> 
> >>> On Tue, Dec 12, 2017 at 12:49:34PM -0500, Programmingkid wrote:
> >>>> 
> >>>>> On Dec 12, 2017, at 9:34 AM, Daniel P. Berrange <address@hidden> wrote:
> >>>>> 
> >>>>> On Sun, Dec 10, 2017 at 02:10:41AM -0500, Programmingkid wrote:
> >>>>>> On Macintosh keyboards there is a key called fn that is used to give 
> >>>>>> the
> >>>>>> function keys more functionality. Does this key exist in the keyboard 
> >>>>>> keys
> >>>>>> database?
> >>>>> 
> >>>>> When you say "Macintosh keyboards" are you talking about the old style
> >>>>> keyboards with Apple's custom ADB connector, or simply Apple branded
> >>>>> USB keyboards ?
> >>>> 
> >>>> USB keyboards.
> >>>> 
> >>>>> 
> >>>>> If its the latter (USB), then please plug it into a Linux machine, and
> >>>>> in a text console (ie not X11) run 'showkey' and press this 'fn' key on
> >>>>> its own and tell me what (if any) hex code gets printed.
> >>>> 
> >>>> There was no response to the fn key.
> >>> 
> >>> Doh, I made a mistake - you need to run   'showkey -s'  to get raw 
> >>> scancodes.
> >>> Can you try this again, pressing 'fn' on its own, and also press 'fn' in
> >>> combination with some function keys.
> >> 
> >> Sorry but showkey still did not register the fn key being pushed.
> > 
> > I don't know how the fn key is handled but the Linux driver knows about it 
> > so maybe it could help to understand:
> > 
> > https://github.com/torvalds/linux/blob/master/drivers/hid/hid-apple.c

> I think the input_event() function is what sends key input to the 
> applications. It appears that the function key is not sent to input_event().

Linux works by turning the keyboard specific scancodes into a standardized
set of key codes that are agnostic of any hardware. Thus Linux doesn't
send the 'fn' key itself. It sees the 'fn'+XXX key combination and sends
a single event. You can see the mapping Linux uses:

static const struct apple_key_translation macbookair_fn_keys[] = {
        { KEY_BACKSPACE, KEY_DELETE },
        { KEY_ENTER,    KEY_INSERT },
        { KEY_F1,       KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY },
        { KEY_F2,       KEY_BRIGHTNESSUP,   APPLE_FLAG_FKEY },
        { KEY_F3,       KEY_SCALE,          APPLE_FLAG_FKEY },
        { KEY_F4,       KEY_DASHBOARD,      APPLE_FLAG_FKEY },
        { KEY_F6,       KEY_PREVIOUSSONG,   APPLE_FLAG_FKEY },
        { KEY_F7,       KEY_PLAYPAUSE,      APPLE_FLAG_FKEY },
        { KEY_F8,       KEY_NEXTSONG,       APPLE_FLAG_FKEY },
        { KEY_F9,       KEY_MUTE,           APPLE_FLAG_FKEY },
        { KEY_F10,      KEY_VOLUMEDOWN,     APPLE_FLAG_FKEY },
        { KEY_F11,      KEY_VOLUMEUP,       APPLE_FLAG_FKEY },
        { KEY_F12,      KEY_EJECTCD,        APPLE_FLAG_FKEY },
        { KEY_UP,       KEY_PAGEUP },
        { KEY_DOWN,     KEY_PAGEDOWN },
        { KEY_LEFT,     KEY_HOME },
        { KEY_RIGHT,    KEY_END },
        { }
};

static const struct apple_key_translation apple_fn_keys[] = {
        { KEY_BACKSPACE, KEY_DELETE },
        { KEY_ENTER,    KEY_INSERT },
        { KEY_F1,       KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY },
        { KEY_F2,       KEY_BRIGHTNESSUP,   APPLE_FLAG_FKEY },
        { KEY_F3,       KEY_SCALE,          APPLE_FLAG_FKEY },
        { KEY_F4,       KEY_DASHBOARD,      APPLE_FLAG_FKEY },
        { KEY_F5,       KEY_KBDILLUMDOWN,   APPLE_FLAG_FKEY },
        { KEY_F6,       KEY_KBDILLUMUP,     APPLE_FLAG_FKEY },
        { KEY_F7,       KEY_PREVIOUSSONG,   APPLE_FLAG_FKEY },
        { KEY_F8,       KEY_PLAYPAUSE,      APPLE_FLAG_FKEY },
        { KEY_F9,       KEY_NEXTSONG,       APPLE_FLAG_FKEY },
        { KEY_F10,      KEY_MUTE,           APPLE_FLAG_FKEY },
        { KEY_F11,      KEY_VOLUMEDOWN,     APPLE_FLAG_FKEY },
        { KEY_F12,      KEY_VOLUMEUP,       APPLE_FLAG_FKEY },
        { KEY_UP,       KEY_PAGEUP },
        { KEY_DOWN,     KEY_PAGEDOWN },
        { KEY_LEFT,     KEY_HOME },
        { KEY_RIGHT,    KEY_END },
        { }
};

static const struct apple_key_translation powerbook_fn_keys[] = {
        { KEY_BACKSPACE, KEY_DELETE },
        { KEY_F1,       KEY_BRIGHTNESSDOWN,     APPLE_FLAG_FKEY },
        { KEY_F2,       KEY_BRIGHTNESSUP,       APPLE_FLAG_FKEY },
        { KEY_F3,       KEY_MUTE,               APPLE_FLAG_FKEY },
        { KEY_F4,       KEY_VOLUMEDOWN,         APPLE_FLAG_FKEY },
        { KEY_F5,       KEY_VOLUMEUP,           APPLE_FLAG_FKEY },
        { KEY_F6,       KEY_NUMLOCK,            APPLE_FLAG_FKEY },
        { KEY_F7,       KEY_SWITCHVIDEOMODE,    APPLE_FLAG_FKEY },
        { KEY_F8,       KEY_KBDILLUMTOGGLE,     APPLE_FLAG_FKEY },
        { KEY_F9,       KEY_KBDILLUMDOWN,       APPLE_FLAG_FKEY },
        { KEY_F10,      KEY_KBDILLUMUP,         APPLE_FLAG_FKEY },
        { KEY_UP,       KEY_PAGEUP },
        { KEY_DOWN,     KEY_PAGEDOWN },
        { KEY_LEFT,     KEY_HOME },
        { KEY_RIGHT,    KEY_END },
        { }
};

The first column in these tables is the physical key pressed, and the
second column is what Linux sends with the 'fn' key is combined.

IOW,  'fn'+'f1' results in 'brightnessdown'

QEMU will work in a similar way - we're not going to send around the 'fn'
key internally to QEMU, instead we'll only send the combination keys.
IOW, we'll need to make sure QEMU has keycodes defined for everything in
the second columns of these tables.

> This key is usable with QEMU on Mac OS X. The NSEventTypeFlagsChanged event
> is what detects it in the cocoa.m file. Currently the code does not account
> for this key. I will make a patch to add support for the function key soon.

So if Cocoa can see the 'fn' key, then it'll need todo similar to what
Linux does - comibing the 'fn' key and keystroke that follows, into a
single QEMU keycode.

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



reply via email to

[Prev in Thread] Current Thread [Next in Thread]