Skip to content

How Media keys works #332

@tmk

Description

@tmk

System/Media Keycodes

Short/long names

/* Sytem Control */
#define KC_PWR KC_SYSTEM_POWER
#define KC_SLEP KC_SYSTEM_SLEEP
#define KC_WAKE KC_SYSTEM_WAKE
/* Consumer Page */
#define KC_MUTE KC_AUDIO_MUTE
#define KC_VOLU KC_AUDIO_VOL_UP
#define KC_VOLD KC_AUDIO_VOL_DOWN
#define KC_MNXT KC_MEDIA_NEXT_TRACK
#define KC_MPRV KC_MEDIA_PREV_TRACK
#define KC_MFFD KC_MEDIA_FAST_FORWARD
#define KC_MRWD KC_MEDIA_REWIND
#define KC_MSTP KC_MEDIA_STOP
#define KC_MPLY KC_MEDIA_PLAY_PAUSE
#define KC_EJCT KC_MEDIA_EJECT
#define KC_MSEL KC_MEDIA_SELECT
#define KC_MAIL KC_MAIL
#define KC_CALC KC_CALCULATOR
#define KC_MYCM KC_MY_COMPUTER
#define KC_WSCH KC_WWW_SEARCH
#define KC_WHOM KC_WWW_HOME
#define KC_WBAK KC_WWW_BACK
#define KC_WFWD KC_WWW_FORWARD
#define KC_WSTP KC_WWW_STOP
#define KC_WREF KC_WWW_REFRESH
#define KC_WFAV KC_WWW_FAVORITES

/* Sytem Control */
#define KC_PWR  KC_SYSTEM_POWER
#define KC_SLEP KC_SYSTEM_SLEEP
#define KC_WAKE KC_SYSTEM_WAKE
/* Consumer Page */
#define KC_MUTE KC_AUDIO_MUTE
#define KC_VOLU KC_AUDIO_VOL_UP
#define KC_VOLD KC_AUDIO_VOL_DOWN
#define KC_MNXT KC_MEDIA_NEXT_TRACK
#define KC_MPRV KC_MEDIA_PREV_TRACK
#define KC_MFFD KC_MEDIA_FAST_FORWARD
#define KC_MRWD KC_MEDIA_REWIND
#define KC_MSTP KC_MEDIA_STOP
#define KC_MPLY KC_MEDIA_PLAY_PAUSE
#define KC_EJCT KC_MEDIA_EJECT
#define KC_MSEL KC_MEDIA_SELECT
#define KC_MAIL KC_MAIL
#define KC_CALC KC_CALCULATOR
#define KC_MYCM KC_MY_COMPUTER
#define KC_WSCH KC_WWW_SEARCH
#define KC_WHOM KC_WWW_HOME
#define KC_WBAK KC_WWW_BACK
#define KC_WFWD KC_WWW_FORWARD
#define KC_WSTP KC_WWW_STOP
#define KC_WREF KC_WWW_REFRESH
#define KC_WFAV KC_WWW_FAVORITES

keycode to system/consumer usage translation

/* keycode to system usage */
#define KEYCODE2SYSTEM(key) \
(key == KC_SYSTEM_POWER ? SYSTEM_POWER_DOWN : \
(key == KC_SYSTEM_SLEEP ? SYSTEM_SLEEP : \
(key == KC_SYSTEM_WAKE ? SYSTEM_WAKE_UP : 0)))
/* keycode to consumer usage */
#define KEYCODE2CONSUMER(key) \
(key == KC_AUDIO_MUTE ? AUDIO_MUTE : \
(key == KC_AUDIO_VOL_UP ? AUDIO_VOL_UP : \
(key == KC_AUDIO_VOL_DOWN ? AUDIO_VOL_DOWN : \
(key == KC_MEDIA_NEXT_TRACK ? TRANSPORT_NEXT_TRACK : \
(key == KC_MEDIA_PREV_TRACK ? TRANSPORT_PREV_TRACK : \
(key == KC_MEDIA_FAST_FORWARD ? TRANSPORT_FAST_FORWARD : \
(key == KC_MEDIA_REWIND ? TRANSPORT_REWIND : \
(key == KC_MEDIA_STOP ? TRANSPORT_STOP : \
(key == KC_MEDIA_EJECT ? TRANSPORT_STOP_EJECT : \
(key == KC_MEDIA_PLAY_PAUSE ? TRANSPORT_PLAY_PAUSE : \
(key == KC_MEDIA_SELECT ? APPLAUNCH_CC_CONFIG : \
(key == KC_MAIL ? APPLAUNCH_EMAIL : \
(key == KC_CALCULATOR ? APPLAUNCH_CALCULATOR : \
(key == KC_MY_COMPUTER ? APPLAUNCH_LOCAL_BROWSER : \
(key == KC_WWW_SEARCH ? APPCONTROL_SEARCH : \
(key == KC_WWW_HOME ? APPCONTROL_HOME : \
(key == KC_WWW_BACK ? APPCONTROL_BACK : \
(key == KC_WWW_FORWARD ? APPCONTROL_FORWARD : \
(key == KC_WWW_STOP ? APPCONTROL_STOP : \
(key == KC_WWW_REFRESH ? APPCONTROL_REFRESH : \
(key == KC_WWW_FAVORITES ? APPCONTROL_BOOKMARKS : 0)))))))))))))))))))))

/* keycode to system usage */
#define KEYCODE2SYSTEM(key) \
    (key == KC_SYSTEM_POWER ? SYSTEM_POWER_DOWN : \
    (key == KC_SYSTEM_SLEEP ? SYSTEM_SLEEP : \
    (key == KC_SYSTEM_WAKE  ? SYSTEM_WAKE_UP : 0)))

/* keycode to consumer usage */
#define KEYCODE2CONSUMER(key) \
    (key == KC_AUDIO_MUTE           ?  AUDIO_MUTE : \
    (key == KC_AUDIO_VOL_UP         ?  AUDIO_VOL_UP : \
    (key == KC_AUDIO_VOL_DOWN       ?  AUDIO_VOL_DOWN : \
    (key == KC_MEDIA_NEXT_TRACK     ?  TRANSPORT_NEXT_TRACK : \
    (key == KC_MEDIA_PREV_TRACK     ?  TRANSPORT_PREV_TRACK : \
    (key == KC_MEDIA_FAST_FORWARD   ?  TRANSPORT_FAST_FORWARD : \
    (key == KC_MEDIA_REWIND         ?  TRANSPORT_REWIND : \
    (key == KC_MEDIA_STOP           ?  TRANSPORT_STOP : \
    (key == KC_MEDIA_EJECT          ?  TRANSPORT_STOP_EJECT : \
    (key == KC_MEDIA_PLAY_PAUSE     ?  TRANSPORT_PLAY_PAUSE : \
    (key == KC_MEDIA_SELECT         ?  APPLAUNCH_CC_CONFIG : \
    (key == KC_MAIL                 ?  APPLAUNCH_EMAIL : \
    (key == KC_CALCULATOR           ?  APPLAUNCH_CALCULATOR : \
    (key == KC_MY_COMPUTER          ?  APPLAUNCH_LOCAL_BROWSER : \
    (key == KC_WWW_SEARCH           ?  APPCONTROL_SEARCH : \
    (key == KC_WWW_HOME             ?  APPCONTROL_HOME : \
    (key == KC_WWW_BACK             ?  APPCONTROL_BACK : \
    (key == KC_WWW_FORWARD          ?  APPCONTROL_FORWARD : \
    (key == KC_WWW_STOP             ?  APPCONTROL_STOP : \
    (key == KC_WWW_REFRESH          ?  APPCONTROL_REFRESH : \
    (key == KC_WWW_FAVORITES        ?  APPCONTROL_BOOKMARKS : 0)))))))))))))))))))))

Protocol: USB LUFA

Linux Xorg(Ubuntu/Xfce):

Keycode Action
POWER Pop out Logout dialog
PWR Pop out Logout dialog
SLEP No action??
WAKE No action(XF86WakeUp)
MUTE Mute
VOLU Volume Down
VOLD Volume Up
MNXT works in VLC media player (XF86AudioNext)
MPRV works in VLC media player (XF86AudioPrev)
MFFD ?? (XF86AudioForward)
MRWD ?? (XF86AudioRewind)
MSTP works in VLC media player (XF86AudioStop)
MPLY works in VLC media player (XF86AudioPlay)
EJCT No action(NoSymbol)
MSEL No action(XF86Tools)
MAIL No action(XF86Mail)
CALC No action(XF86Calculator)
MYCM No action(XF86Explorer)
WSCH Focus address bar in Chrome49 (XF86Search)
WHOM Load home page in Chrome49 (XF86HomePage)
WBAK History back in Chrome49 (XF86Back)
WFWD History forward in Chrome49 (XF86Forward)
WSTP ??(Cancel)
WREF Refresh in Chrome49 (XF86Reload)
WFAV Toggle bookmark bar in Chrome49 (XF86Favorites)

Windows 10

Keycode Action
POWER No action (BIOS scan code:E05E)
PWR act as Power button on my ThinkPad
SLEP act as Sleep button on my ThinkPad
WAKE No action
MUTE Mute
VOLU Volume Down
VOLD Volume Up
MNXT works in Windows media player
MPRV works in Windows media player
MFFD ??
MRWD ??
MSTP works in Widnows media player
MPLY works in Windows media player
EJCT No action
MSEL Open media player
MAIL Open default Mailer
CALC Open Calculator
MYCM Open Explorer
WSCH Open Search Windows dialog
WHOM Load home page in Internet Explorer
WBAK History back in Internet Explorer
WFWD History forward in Internet Explorer
WSTP Stop loading in Internet Explorer
WREF Refresh in Internet Explorer
WFAV Toggle bookmark pane in Internet Explorer

OSX

Please contribute.

Use MFFD and MRWD instead of MNXT and MPRV.
https://github.com/tmk/tmk_keyboard/wiki/FAQ-Keymap#media-control-keys-in-mac-osx

Protocol: Bluetooth HHKB w/ RN42

https://geekhack.org/index.php?topic=12047.0
http://www.microchip.com/wwwproducts/en/RN42

Supported usages

RN42 supports only keycodes below.

MUTE
VOLU
VOLD
MNXT
MPRV
MFFD
MRWD
MSTP
MPLY
EJCT
MAIL
WSCH
WHOM

static uint16_t usage2bits(uint16_t usage)
{
switch (usage) {
case AC_HOME: return 0x01;
case AL_EMAIL: return 0x02;
case AC_SEARCH: return 0x04;
//case AL_KBD_LAYOUT: return 0x08; // Apple virtual keybaord toggle
case AUDIO_VOL_UP: return 0x10;
case AUDIO_VOL_DOWN: return 0x20;
case AUDIO_MUTE: return 0x40;
case TRANSPORT_PLAY_PAUSE: return 0x80;
case TRANSPORT_NEXT_TRACK: return 0x100;
case TRANSPORT_PREV_TRACK: return 0x200;
case TRANSPORT_STOP: return 0x400;
case TRANSPORT_STOP_EJECT: return 0x800;
case TRANSPORT_FAST_FORWARD: return 0x1000;
case TRANSPORT_REWIND: return 0x2000;
//case return 0x4000; // Stop/eject
//case return 0x8000; // Internet browser
};
return 0;
}

static uint16_t usage2bits(uint16_t usage)
{
    switch (usage) {
        case AC_HOME:                 return 0x01;
        case AL_EMAIL:                return 0x02;
        case AC_SEARCH:               return 0x04;
        //case AL_KBD_LAYOUT:         return 0x08;  // Apple virtual keybaord toggle
        case AUDIO_VOL_UP:            return 0x10;
        case AUDIO_VOL_DOWN:          return 0x20;
        case AUDIO_MUTE:              return 0x40;
        case TRANSPORT_PLAY_PAUSE:    return 0x80;
        case TRANSPORT_NEXT_TRACK:    return 0x100;
        case TRANSPORT_PREV_TRACK:    return 0x200;
        case TRANSPORT_STOP:          return 0x400;
        case TRANSPORT_STOP_EJECT:    return 0x800;
        case TRANSPORT_FAST_FORWARD:  return 0x1000;
        case TRANSPORT_REWIND:        return 0x2000;
        //case return 0x4000;   // Stop/eject
        //case return 0x8000;   // Internet browser
    };
    return 0;
}

Linux Xorg(Ubuntu/Xfce)

Keycode Action
MUTE Mute
VOLU Volume Down
VOLD Volume Up
MNXT works in VLC media player
MPRV works in VLC media player
MFFD No action
MRWD No action
MSTP works in VLC media player
MPLY works in VLC media player
EJCT No action
MAIL No action
WSCH Open Search Windows dialog
WHOM Load home page in Internet Explorer

Windows 10

Keycode Action
MUTE Mute
VOLU Volume Down
VOLD Volume Up
MNXT works in Windows media player
MPRV works in Windows media player
MFFD ??
MRWD ??
MSTP works in Widnows media player
MPLY works in Windows media player
EJCT No action
MAIL No action
WSCH Focus address bar in Chrome49 (XF86Search)
WHOM Load home page in Chrome49 (XF86HomePage)

OSX

Please contribute.

Use MFFD and MRWD instead of MNXT and MPRV.
https://github.com/tmk/tmk_keyboard/wiki/FAQ-Keymap#media-control-keys-in-mac-osx

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions