#include <stdint.h>
#include <stdio.h>

#include <X11/keysymdef.h>
#include <X11/Xlib.h>
#include <X11/extensions/XTest.h>

struct TEvent {
    uint32_t Dunno;
    uint32_t Key;
    uint64_t Dunno2;
};

int main()
{
    char static_assert[sizeof(TEvent) == 16 ? 1 : -1];
    (void)static_assert;
    FILE* pf = fopen("/dev/input/js0", "r");
    TEvent data;
    size_t read;
    Display* display = XOpenDisplay(NULL);
    KeyCode keycode;
    KeySym keysym;
    while (true)
    {
        read = fread(&data, 1, 16, pf);
        if (read == 16) {
            switch (data.Key) {
            case 163841:
                keysym = XK_KP_Left;
                break;
            case 16941057:
                keysym = XK_KP_Up;
                break;
            case 163839:
                keysym = XK_KP_Right;
                break;
            case 16941055:
                keysym = XK_KP_Down;
                break;
            case 134283265:
                keysym = XK_KP_Tab;
                break;
            case 151060481:
                keysym = XK_KP_Enter;
                break;
            case 65537:
                keysym = XK_KP_F1;
                break;
            case 16842753:
                keysym = XK_KP_F2;
                break;
            case 33619969:
                keysym = XK_KP_F3;
                break;
            case 50397185:
                keysym = XK_KP_F4;
                break;
            case 100728833:
                keysym = XK_KP_Page_Up;
                break;
            case 67174401:
                keysym = XK_KP_Page_Down;
                break;
            case 117506049:
                keysym = XK_KP_Begin;
                break;
            case 83951617:
                keysym = XK_KP_End;
                break;
            }
            keycode = XKeysymToKeycode(display, keysym);
            XTestFakeKeyEvent(display, keycode, True, 0);
            XTestFakeKeyEvent(display, keycode, False, 0);
        }
    }
}

