[PATCH] xkb: Fix repeat behaviour of redirect and message actions

wettstein509 at solnet.ch wettstein509 at solnet.ch
Tue Jan 29 12:41:03 PST 2013

> yes pleas. and tbh, I was hoping for something stronger than "I believe" :)

Well, it did build for me, so I have to guess what is different...

> do you have a good test-case for this one?

Using this:

    key <FK06> {
        type= "THREE_LEVEL",
        symbols[Group1]= [           NoSymbol,         NoSymbol, KP_3 ],
	actions[Group1]= [ RedirectKey(key=<KP1>), RedirectKey(key=<KP2>,clearMods=Shift), RedirectKey(key=<FK06>) ]

Regarding the (re)moved 'return 0' in particular, press and hold F6 and
then another key while F6 is still down; that other key should not be

Otherwise, one can try out the various different orders of
pressing/releasing Shift, ISO_Level3_Shift, and F6 and check whether the
results are correct.  Apart from creating KP_1, KP_2 and KP_3, this also
means that all keys that get pressed also get released.  Finally, one
can try with autorepeat, pressing and releasing Shift and
ISO_Level3_Shift while FK06 autorepeats.

For the changes to action messages:

    key <FK06> {
        type= "TWO_LEVEL",
        symbols[Group1]= [           KP_3,         KP_2 ],
	actions[Group1]= [ ActionMessage(report=all,data="Base", genkeyevent), ActionMessage(report=all, data="Shift", genkeyevent=no) ]

There are a few more options to test, namely, 'report=press' and
'report=release'.  With a little program one can observe what
action messages get sent:

#include <X11/Xlibint.h>
#include <X11/Xlib.h>
#include <X11/XKBlib.h>
#include <stdio.h>

int main(int argn, char** argv){
    int xkbbasecode, errcode, statcode;
    Display* dpy = XkbOpenDisplay(NULL, &xkbbasecode, &errcode, NULL, NULL, &statcode);

    XkbSelectEvents(dpy, XkbUseCoreKbd, XkbActionMessageMask, XkbActionMessageMask);

	XkbEvent event;
	XNextEvent(dpy, &event.core);
	if(event.type == xkbbasecode){
	    if(event.any.xkb_type == XkbActionMessage){
		const char* m = event.message.message;
		const unsigned int kc = event.message.keycode;
		printf("Keycode %d press %d message %s\n", kc, event.message.press, m);

    return 0;



More information about the xorg-devel mailing list