TYPEMAP
Display *             O_X11_Xlib
DisplayOrNull         O_X11_XlibOrNull
Screen *              O_X11_Xlib_Screen
ScreenNumber          O_X11_Xlib_ScreenNumber
Visual *              O_X11_Xlib_OpaqueDisplayMember
VisualOrNull          O_X11_Xlib_OpaqueDisplayMemberOrNull
GC                    O_X11_Xlib_OpaqueDisplayMember
XEvent *              O_X11_Xlib_Struct
XVisualInfo *         O_X11_Xlib_Struct
XWindowChanges *      O_X11_Xlib_Struct
XWindowAttributes *   O_X11_Xlib_Struct
XSetWindowAttributes* O_X11_Xlib_Struct
XSizeHints *          O_X11_Xlib_Struct
XRectangle *          O_X11_Xlib_Struct
XRenderPictFormat *   O_X11_Xlib_Struct
Window                O_X11_Xlib_XID
Pixmap                O_X11_Xlib_XID
Cursor                O_X11_Xlib_XID
Colormap              O_X11_Xlib_XID
Drawable              O_X11_Xlib_XID
VisualID              O_X11_Xlib_XID
XserverRegion         O_X11_Xlib_XID
Glyph                 O_X11_Xlib_XID
GlyphSet              O_X11_Xlib_XID
Picture               O_X11_Xlib_XID
PictFormat            O_X11_Xlib_XID
Atom                  T_UV
Time                  T_UV
Bool                  T_BOOL
KeyCode               T_IV
KeySym                T_IV

INPUT
O_X11_Xlib
    $var = PerlXlib_display_objref_get_pointer($arg, PerlXlib_OR_DIE);

OUTPUT
O_X11_Xlib
    $arg = PerlXlib_get_display_objref($var, PerlXlib_OR_UNDEF);

INPUT
O_X11_XlibOrNull
    $var = PerlXlib_display_objref_get_pointer($arg, PerlXlib_OR_NULL);

OUTPUT
O_X11_XlibOrNull
    $arg = PerlXlib_get_display_objref($var, PerlXlib_OR_UNDEF);

INPUT
O_X11_Xlib_ScreenNumber
    if (!SvOK($arg))
        $var = DefaultScreen(dpy);
    else if (SvROK($arg)) {
        SV **fp;
        if (SvTYPE(SvRV($arg)) == SVt_PVHV && (fp= hv_fetch((HV*)SvRV($arg), \"screen_number\", 13, 0)) && fp) {
            $var= SvIV(*fp);
        }
        else croak(\"Invalid object passed as Screen number\");
    }
    else {
        $var= SvIV($arg);
        if ($var == -1) $var= DefaultScreen(dpy);
    }

INPUT
O_X11_Xlib_Screen
    $var = PerlXlib_sv_to_screen($arg, 1);

OUTPUT
O_X11_Xlib_Screen
    $arg = PerlXlib_obj_for_screen($var, 0);

INPUT
O_X11_Xlib_XID
    $var = PerlXlib_sv_to_xid($arg);

OUTPUT
O_X11_Xlib_XID
    // Always return unsigned integer.  X11::Xlib::* can override this as needed.
    sv_setuv( $arg, $var );

INPUT
O_X11_Xlib_Struct
    $var= ( $type ) PerlXlib_get_struct_ptr(
        $arg, 0, \"X11::Xlib::@{[ $type =~ /(\w+)/ ]}\", sizeof(@{[ $type =~ /(\w+)/ ]}),
        (PerlXlib_struct_pack_fn*) &PerlXlib_@{[ $type =~ /(\w+)/ ]}_pack
    );

INPUT
O_X11_Xlib_Opaque
    $var= ($type) PerlXlib_objref_get_pointer($arg, \"@{[ $type =~ /(\w+)/ ]}\", PerlXlib_OR_DIE);

INPUT
O_X11_Xlib_OpaqueDisplayMember
    $var= ($type) PerlXlib_objref_get_pointer($arg, \"@{[ $type =~ /(\w+)/ ]}\", PerlXlib_OR_DIE);

INPUT
O_X11_Xlib_OpaqueOrNull
    $var= ($type) PerlXlib_objref_get_pointer($arg, \"@{[ $type =~ /(\w+?)OrNull/ ]}\", PerlXlib_OR_NULL);

INPUT
O_X11_Xlib_OpaqueDisplayMemberOrNull
    $var= ($type) PerlXlib_objref_get_pointer($arg, \"@{[ $type =~ /(\w+?)OrNull/ ]}\", PerlXlib_OR_NULL);

OUTPUT
O_X11_Xlib_Opaque
    sv_setsv($arg, PerlXlib_get_objref($var, PerlXlib_AUTOCREATE, \"@{[ $type =~ /(\w+)/ ]}\",
        SVt_PVHV, \"X11::Xlib::@{[ $type =~ /(\w+)/ ]}\", NULL));

OUTPUT
O_X11_Xlib_OpaqueDisplayMember
    sv_setsv($arg, PerlXlib_get_objref($var, PerlXlib_AUTOCREATE, \"@{[ $type =~ /(\w+)/ ]}\",
        SVt_PVHV, \"X11::Xlib::@{[ $type =~ /(\w+)/ ]}\", dpy));

OUTPUT
O_X11_Xlib_OpaqueOrNull
    sv_setsv($arg, PerlXlib_get_objref($var, PerlXlib_AUTOCREATE, \"@{[ $type =~ /(\w+?)OrNull/ ]}\",
        SVt_PVHV, \"X11::Xlib::@{[ $type =~ /(\w+?)OrNull/ ]}\", NULL));

OUTPUT
O_X11_Xlib_OpaqueDisplayMemberOrNull
    sv_setsv($arg, PerlXlib_get_objref($var, PerlXlib_AUTOCREATE, \"@{[ $type =~ /(\w+?)OrNull/ ]}\",
        SVt_PVHV, \"X11::Xlib::@{[ $type =~ /(\w+?)OrNull/ ]}\", dpy));