Getting working media keys in Ubuntu 18.04+

Last updated
3 June 2020
Ben Talbot

Using headphones with an Ubuntu machine should be simple

I've been plagued by issues with media keys since Ubuntu 18.04. Sometimes they work, sometimes they work in odd ways, and other times they don't seem to work at all.

From what I gather, it seems the first application you open post-boot with media key support calls "dibs" on receiving those events. Which works well for that first application, while it's alive. Open a Chrome tab that grabs the keys first, and as soon you close the tab your media key events will be sent to nothing until you reboot. Even opening Spotify first, closing it, and re-opening later leads to an unreliable experience at best.

Ideally there would be a cute UI somewhere in GNOME that lets you pick the target of your media key events, like maybe here:

A potential place for the "pick media key events target" option in Gnomes sound settings

A potential place for the "pick media key events target" option in Gnome's sound settings

I wasn't able to find any hints on picking the target for media key events in GNOME, so instead I resorted to reliably forcing the events to somewhere useful: Spotify. What follows is a short brain dump of how I got there, with some notes getting around the difficulties GNOME throws your way.

Controlling the target command for media keys

GNOME intercepts most keys from the XServer, and will redirect them elsewhere when they have a shortcut set. This converts them into something that other programs can't handle apparently. The key conclusion: grabbing keyboard input outside of GNOME was going to be much more effort than working within GNOME.

Controlling Spotify playback with commands

The easiest solution was to let GNOME continue intercepting media keys, then redirect them to a commands controlling Spotify. The downside is media keys end up locked to a single application, but that's still better than the current situation.

The commands for controlling Spotify through dbus are:

  • play / pause:
    u@pc:~$ dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify \ /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause
  • next:
    u@pc:~$ dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify \ /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Next
  • previous:
    u@pc:~$ dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify \ /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Previous

Linking the media keys to a command

Next, the commands had to be tied to the media keys using GNOME. This shouldn't need a description, but unfortunately this is a mission due to the troublesome keyboard shortcut UI.

The GNOME custom keyboard shortcut UI...

How can I enter special keys, like the media keys, into this UI?

The UI looks cute, but that's where the utility ends. It only allows you to physically enter the keys, and doesn't register most special keys, including our media keys. So instead of using a nice UI, we embark on this journey:

  1. Find the name of the media key you wish to bind to using xmodmap -pk and sudo showkey. Play, next, and previous corresponded to 'AudioPlay', 'XF86AudioNext', and 'XF86AudioPrev' respectively on my keyboard.

  2. Go into the UI & add the custom shortcut but don't specify the key.

  3. Find the name for the custom shortcut in the DConf database using gsettings:

    u@pc:~$ gsettings get name
  4. Once you've found your custom shortcut, modify the binding via:

    u@pc:~$ gsettings set binding 'NEW_KEY_NAME'
  5. If there is a previous shortcut using that key, you next need to edit your shortcut (change a character or whatever) in the UI, & then click replace to force disable of the previous shortcut.

  6. Then you seem to have to do step #4 again to get it to stick...

One last thing I didn't get to figuring out, was why the numbers were 8 off what sudo showkey was displaying. For example key 200 in showkey corresponded to key 208 in xmodmap.


And there we have it, usable media keys in Ubuntu 18.04+. I don't know why it's this messy, or if this is the cleanest hack, but it was enough to get me somewhere. As always, I'd be interested in a proper solution if anyone has any tips!

Let me know below if you liked this content, or found it valuable, using the buttons below.

Like this?

Loading donation link...

© Ben Talbot. All rights reserved.