I get the OSD for vol-up and vol-down, but not for mute. The keybinding is set to the right keysym, and xev confirms that a) the keysym is correctly produced and b) it is not grabbed
Nothing changed in that code recently (meaning for the last few major releases). Is the key actually configured to be grabbed in the prefs? If so, then a g-s-d debug log would be appreciated.
Yes, it is configured in the keybinding capplet. I'll see about getting you a log later
It gets tripped up by this code: for (i = 0; i < HANDLED_KEYS; i++) { if (match_key (keys[i].key, xev)) { switch (keys[i].key_type) { case VOLUME_DOWN_KEY: case VOLUME_UP_KEY: /* auto-repeatable keys */ if (xev->type != KeyPress) { return GDK_FILTER_CONTINUE; } break; default: if (xev->type != KeyRelease) { return GDK_FILTER_CONTINUE; } } We are ignoring the KeyPress, and then we never see a key release. This is likely fallout from csw even handling changes, I think.
Moving over to X for now
Moving back to X, after figuring out that this is just interference from different g-s-d plugins: the locate-pointer feature is blindly ungrabbing the keyboard, making us loose the key release events.
I think the only way to fix this is to move the locate-pointer feature out of the g-s-d process, or at least open a dedicated X connection for it.
I've moved the locate-pointer feature to a separate process, and media-keys can happily coexist with it now.