The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

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

static Display *TheXDisplay = NULL;

MODULE = X11::Xlib                PACKAGE = X11::Xlib

void
new(class, display = NULL)
    char * class
    char * display
    PREINIT:
        Display * dpy;
    PPCODE:
        dpy = XOpenDisplay(display);
        XPUSHs(sv_2mortal(sv_setref_pv(newSVpv("", 0), "X11::Xlib", dpy)));

void
DESTROY(dpy)
    Display *dpy
    PPCODE:
        (void) XCloseDisplay(dpy);

int
DisplayWidth(dpy, screen=0)
    Display *dpy
    int screen
    CODE:
        RETVAL = DisplayWidth(dpy, screen);
    OUTPUT:
        RETVAL

int
DisplayHeight(dpy, screen=0)
    Display *dpy
    int screen
    CODE:
        RETVAL = DisplayHeight(dpy, screen);
    OUTPUT:
        RETVAL


# /* Windows */

void
RootWindow(dpy, screen)
    Display * dpy
    int screen
    PREINIT:
        Window window;
    PPCODE:
        window = RootWindow(dpy, screen);
        XPUSHs(sv_2mortal(sv_setref_uv(newSVpv("", 0), "X11::Xlib::Window", window)));

# /* Event */

int
XTestFakeMotionEvent(dpy, screen, x, y, EventSendDelay = 10)
    Display * dpy
    int screen
    int x
    int y
    int EventSendDelay

int
XTestFakeButtonEvent(dpy, button, pressed, EventSendDelay = 10);
    Display * dpy
    int button
    int pressed
    int EventSendDelay

int
XTestFakeKeyEvent(dpy, kc, pressed, EventSendDelay = 10)
    Display * dpy
    unsigned char kc
    int pressed
    int EventSendDelay

void
XBell(dpy, percent)
    Display * dpy
    int percent

void
XQueryKeymap(dpy)
    Display * dpy
    PREINIT:
        char keys_return[32];
        int i, j;
    PPCODE:
        XQueryKeymap(dpy, keys_return);
        for(i=0; i<32; i++) {
            for (j=0; j<8;j++) {
                if (keys_return[i] & (1 << j))
                    XPUSHs(sv_2mortal(newSViv(i * 8 + j)));
            }
        }

unsigned long
keyboard_leds(dpy)
    Display * dpy;
    PREINIT:
        XKeyboardState state;
    CODE:
        XGetKeyboardControl(dpy, &state);
        RETVAL = state.led_mask;
    OUTPUT:
        RETVAL

void
_auto_repeat(dpy)
    Display * dpy;
    PREINIT:
        XKeyboardState state;
        int i, j;
    CODE:
        XGetKeyboardControl(dpy, &state);
        for(i=0; i<32; i++) {
            for (j=0; j<8; j++) {
                if (state.auto_repeats[i] & (1 << j))
                    XPUSHs(sv_2mortal(newSViv(i * 8 + j)));
            }
        }

void
XFlush(dpy)
    Display *dpy

void
XSync(dpy, flush=0)
    Display * dpy
    int flush

# /* keyboard functions */

char *
XKeysymToString(keysym)
    unsigned long keysym
    CODE:
        RETVAL = XKeysymToString(keysym);
    OUTPUT:
        RETVAL

unsigned long
XStringToKeysym(string)
    char * string
    CODE:
        RETVAL = XStringToKeysym(string);
    OUTPUT:
        RETVAL

int
IsKeypadKey(keysym)
    unsigned long keysym

int
IsPrivateKeypadKey(keysym)
    unsigned long keysym

int
IsPFKey(keysym)
    unsigned long keysym

int
IsFunctionKey(keysym)
    unsigned long keysym

int
IsMiscFunctionKey(keysym)
    unsigned long keysym

int
IsModifierKey(keysym)
    unsigned long keysym

unsigned int
XKeysymToKeycode(dpy, keysym)
    Display *dpy
    unsigned long keysym
    CODE:
        RETVAL = XKeysymToKeycode(dpy, keysym);
    OUTPUT:
        RETVAL


void
XGetKeyboardMapping(dpy, fkeycode, count = 1)
    Display *dpy
    unsigned int fkeycode
    int count
    PREINIT:
    int creturn;
    KeySym * keysym;
    int i = 0;
    PPCODE:
    keysym = XGetKeyboardMapping(dpy, fkeycode, count, &creturn);
    EXTEND(SP, creturn -1);
    for (i=0; i < creturn; i++)
        XPUSHs(sv_2mortal(newSVuv(keysym[i])));
    
MODULE = X11::Xlib                PACKAGE = X11::Xlib::Window

unsigned int
id(window)
    Window window
    CODE:
        RETVAL = window;
    OUTPUT:
        RETVAL