← Back to team overview

sslug-teknik team mailing list archive

XSendEvent

 

Hey

Jeg har en spillemaskine baseret på Linux, og den har et sæt knapper,
som jeg kan få events fra via et ubehageligt proprietært API.
Dem laver jeg om til X events via XSendEvent, og det virkede fint på en
Ubuntu 8.04, men jeg ville gerne have denne opgraderet, og så holdt det
op med at virke.

Følgende lille program illustrerer, hvad jeg gør:

////////////////////////////////////////////////////////////////////////////
#include <X11/Xlib.h>
#include <unistd.h>

void send_event(Display * display, int type, KeyCode code) {
    Window window;
    XKeyEvent event;
    int revert = RevertToNone;

    XGetInputFocus(display, &window, &revert);

    event.display = display;
    event.window = window;
    event.root = DefaultRootWindow(display);
    event.subwindow = None;
    event.time = CurrentTime;
    event.x = 1;
    event.y = 1;
    event.x_root = 1;
    event.y_root = 1;
    event.same_screen = True;
    event.type = type;
    event.keycode = code;

    XSendEvent(event.display, event.window, True,
KeyPressMask|KeyReleaseMask, (XEvent*)&event);
    XFlush(display);
}

int main(int argc, char const *argv[]) {
    Display * display = NULL;
    KeyCode code;

    display = XOpenDisplay(argc > 1 ? argv[1] : ":0.0");
    if (display) {
        code = XKeysymToKeycode(display, 0x20);//Space
        while (1) {
            send_event(display, KeyPress, code);
            sleep(1);
            send_event(display, KeyRelease, code);
            sleep(1);
        }
        XCloseDisplay(display);
    }
    return 0;
}
////////////////////////////////////////////////////////////////////////////

Compile med: 'gcc -o test test.c -lX11'

Basically så sender det keypress for mellemrum, sover et sekund, sender
keyrelease for mellemrum, sover et sekund i et loop.
Det er det fokuserede vindue, som får disse events.

Det virker fint i Ubuntu 8.04, men ikke i 12.04. Ved I hvad der er sket
siden da?
Og hvad kan jeg gøre for at fixe det?

VH og god weekend
Robert


Follow ups