--- /dev/null
+! Copyright (C) 2010 Niklas Waern.
+! See http://factorcode.org/license.txt for BSD license.
+USING: alien alien.c-types alien.libraries alien.syntax
+classes.struct locals sequences x11.syntax x11.xlib ;
+EXCLUDE: math => float ;
+IN: x11.xinput2.ffi
+
+<< "xinput2" "libXi.so" cdecl add-library >>
+
+LIBRARY: xinput2
+
+
+! *********
+! * XI2.h *
+! *********
+:: XISetMask ( mask event -- )
+ event -3 shift :> index
+ event 7 bitand 2^ :> bit-mask
+ bit-mask index mask nth bitor
+ index mask set-nth ; inline
+
+:: XIClearMask ( mask event -- )
+ event -3 shift :> index
+ event 7 bitand 2^ bitnot :> bit-mask
+ bit-mask index mask nth bitand
+ index mask set-nth ; inline
+
+:: XIMaskIsSet ( mask event -- n )
+ event -3 shift :> index
+ event 7 bitand 2^ :> bit-mask
+ bit-mask index mask nth bitand ;
+
+: XIMaskLen ( event -- n ) 7 + -3 shift ;
+
+
+! *************
+! * XInput2.h *
+! *************
+STRUCT: XIAddMasterInfo
+ { type int }
+ { name c-string }
+ { send_core Bool }
+ { enable Bool } ;
+
+STRUCT: XIRemoveMasterInfo
+ { type int }
+ { deviceid int }
+ { return_mode int }
+ { return_pointer int }
+ { return_keyboard int } ;
+
+STRUCT: XIAttachSlaveInfo
+ { type int }
+ { deviceid int }
+ { new_master int } ;
+
+STRUCT: XIDetachSlaveInfo
+ { type int }
+ { deviceid int } ;
+
+UNION-STRUCT: XIAnyHierarchyChangeInfo
+ { type int }
+ { add XIAddMasterInfo }
+ { remove XIRemoveMasterInfo }
+ { attach XIAttachSlaveInfo }
+ { detach XIDetachSlaveInfo } ;
+
+STRUCT: XIModifierState
+ { base int }
+ { latched int }
+ { locked int }
+ { effective int } ;
+
+TYPEDEF: XIModifierState XIGroupState
+
+STRUCT: XIButtonState
+ { mask_len int }
+ { mask uchar* } ;
+
+STRUCT: XIValuatorState
+ { mask_len int }
+ { mask uchar* }
+ { values double* } ;
+
+STRUCT: XIEventMask
+ { deviceid int }
+ { mask_len int }
+ { mask uchar* } ;
+
+STRUCT: XIAnyClassInfo
+ { type int }
+ { sourceid int } ;
+
+STRUCT: XIButtonClassInfo
+ { type int }
+ { sourceid int }
+ { num_buttons int }
+ { labels Atom* }
+ { state XIButtonState } ;
+
+STRUCT: XIKeyClassInfo
+ { type int }
+ { sourceid int }
+ { num_keycodes int }
+ { keycodes int* } ;
+
+STRUCT: XIValuatorClassInfo
+ { type int }
+ { sourceid int }
+ { number int }
+ { label Atom }
+ { min double }
+ { max double }
+ { value double }
+ { resolution int }
+ { mode int } ;
+
+STRUCT: XIDeviceInfo
+ { deviceid int }
+ { name c-string }
+ { use int }
+ { attachment int }
+ { enabled Bool }
+ { num_classes int }
+ { classes XIAnyClassInfo** } ;
+
+STRUCT: XIGrabModifiers
+ { modifiers int }
+ { status int } ;
+
+
+! Generic XI2 event. All XI2 events have the same header.
+STRUCT: XIEvent
+ { type int }
+ { serial ulong }
+ { send_event Bool }
+ { display Display* }
+ { extension int }
+ { evtype int }
+ { time Time } ;
+
+STRUCT: XIHierarchyInfo
+ { deviceid int }
+ { attachment int }
+ { use int }
+ { enabled Bool }
+ { flags int } ;
+
+! Notifies the client that the device hierarcy has been changed
+! The client is expected to re-query the server for the device
+! hierarchy.
+STRUCT: XIHierarchyEvent
+ { type int }
+ { serial ulong }
+ { send_event Bool }
+ { display Display }
+ { extension int }
+ { evtype int }
+ { time Time }
+ { flags int }
+ { num_info int }
+ { info XIHierarchyInfo* } ;
+
+! Notifies the client that the classes have been changed.
+! This happens when the slave device that sends through the
+! master changes.
+STRUCT: XIDeviceChangedEvent
+ { type int }
+ { serial ulong }
+ { send_event Bool }
+ { display Display* }
+ { extension int }
+ { evtype int }
+ { time Time }
+ { deviceid int }
+ { sourceid int }
+ { reason int }
+ { num_classes int }
+ { classes XIAnyClassInfo** } ;
+
+STRUCT: XIDeviceEvent
+ { type int }
+ { serial ulong }
+ { send_event Bool }
+ { display Display* }
+ { extension int }
+ { evtype int }
+ { time Time }
+ { deviceid int }
+ { sourceid int }
+ { detail int }
+ { root Window }
+ { event Window }
+ { child Window }
+ { root_x double }
+ { root_y double }
+ { event_x double }
+ { event_y double }
+ { flags int }
+ { buttons XIButtonState }
+ { valuators XIValuatorState }
+ { mods XIModifierState }
+ { group XIGroupState } ;
+
+STRUCT: XIRawEvent
+ { type int }
+ { serial ulong }
+ { send_event Bool }
+ { display Display* }
+ { extension int }
+ { evtype int }
+ { time Time }
+ { deviceid int }
+ { sourceid int }
+ { detail int }
+ { flags int }
+ { valuators XIValuatorState }
+ { raw_values double* } ;
+
+STRUCT: XIEnterEvent
+ { type int }
+ { serial ulong }
+ { send_event Bool }
+ { display Display* }
+ { extension int }
+ { evtype int }
+ { time Time }
+ { deviceid int }
+ { sourceid int }
+ { detail int }
+ { root Window }
+ { event Window }
+ { child Window }
+ { root_x double }
+ { root_y double }
+ { event_x double }
+ { event_y double }
+ { mode int }
+ { focus Bool }
+ { same_screen Bool }
+ { buttons XIButtonState }
+ { mods XIModifierState }
+ { group XIGroupState } ;
+
+TYPEDEF: XIEnterEvent XILeaveEvent
+TYPEDEF: XIEnterEvent XIFocusInEvent
+TYPEDEF: XIEnterEvent XIFocusOutEvent
+
+STRUCT: XIPropertyEvent
+ { type int }
+ { serial ulong }
+ { send_event Bool }
+ { display Display* }
+ { extension int }
+ { evtype int }
+ { time Time }
+ { deviceid int }
+ { property Atom }
+ { what int } ;
+
+
+
+X-FUNCTION: Bool XIQueryPointer (
+ Display* display,
+ int deviceid,
+ Window win,
+ Window* root,
+ Window* child,
+ double* root_x,
+ double* root_y,
+ double* win_x,
+ double* win_y,
+ XIButtonState* buttons,
+ XIModifierState* mods,
+ XIGroupState* group ) ;
+
+X-FUNCTION: Bool XIWarpPointer (
+ Display* display,
+ int deviceid,
+ Window src_win,
+ Window dst_win,
+ double src_x,
+ double src_y,
+ uint src_width,
+ uint src_height,
+ double dst_x,
+ double dst_y ) ;
+
+X-FUNCTION: Status XIDefineCursor (
+ Display* display,
+ int deviceid,
+ Window win,
+ Cursor cursor ) ;
+
+X-FUNCTION: Status XIUndefineCursor (
+ Display* display,
+ int deviceid,
+ Window win ) ;
+
+X-FUNCTION: Status XIChangeHierarchy (
+ Display* display,
+ XIAnyHierarchyChangeInfo* changes,
+ int num_changes ) ;
+
+X-FUNCTION: Status XISetClientPointer (
+ Display* dpy,
+ Window win,
+ int deviceid ) ;
+
+X-FUNCTION: Bool XIGetClientPointer (
+ Display* dpy,
+ Window win,
+ int* deviceid ) ;
+
+X-FUNCTION: int XISelectEvents (
+ Display* dpy,
+ Window win,
+ XIEventMask* masks,
+ int num_masks ) ;
+
+X-FUNCTION: XIEventMask* XIGetSelectedEvents (
+ Display* dpy,
+ Window win,
+ int* num_masks_return ) ;
+
+X-FUNCTION: Status XIQueryVersion (
+ Display* display,
+ int* major_version_inout,
+ int* minor_version_inout ) ;
+
+X-FUNCTION: XIDeviceInfo* XIQueryDevice (
+ Display* dpy,
+ int deviceid,
+ int* ndevices_return ) ;
+
+X-FUNCTION: Status XISetFocus (
+ Display* dpy,
+ int deviceid,
+ Window focus,
+ Time time ) ;
+
+X-FUNCTION: Status XIGetFocus (
+ Display* dpy,
+ int deviceid,
+ Window* focus_return ) ;
+
+X-FUNCTION: Status XIGrabDevice (
+ Display* dpy,
+ int deviceid,
+ Window grab_window,
+ Time time,
+ Cursor cursor,
+ int grab_mode,
+ int paired_device_mode,
+ Bool owner_events,
+ XIEventMask* mask ) ;
+
+X-FUNCTION: Status XIUngrabDevice (
+ Display* dpy,
+ int deviceid,
+ Time time ) ;
+
+X-FUNCTION: Status XIAllowEvents (
+ Display* display,
+ int deviceid,
+ int event_mode,
+ Time time ) ;
+
+X-FUNCTION: int XIGrabButton (
+ Display* display,
+ int deviceid,
+ int button,
+ Window grab_window,
+ Cursor cursor,
+ int grab_mode,
+ int paired_device_mode,
+ int owner_events,
+ XIEventMask* mask,
+ int num_modifiers,
+ XIGrabModifiers* modifiers_inout ) ;
+
+X-FUNCTION: int XIGrabKeycode (
+ Display* display,
+ int deviceid,
+ int keycode,
+ Window grab_window,
+ int grab_mode,
+ int paired_device_mode,
+ int owner_events,
+ XIEventMask* mask,
+ int num_modifiers,
+ XIGrabModifiers* modifiers_inout ) ;
+
+X-FUNCTION: int XIGrabEnter (
+ Display* display,
+ int deviceid,
+ Window grab_window,
+ Cursor cursor,
+ int grab_mode,
+ int paired_device_mode,
+ int owner_events,
+ XIEventMask* mask,
+ int num_modifiers,
+ XIGrabModifiers* modifiers_inout ) ;
+
+X-FUNCTION: int XIGrabFocusIn (
+ Display* display,
+ int deviceid,
+ Window grab_window,
+ int grab_mode,
+ int paired_device_mode,
+ int owner_events,
+ XIEventMask* mask,
+ int num_modifiers,
+ XIGrabModifiers* modifiers_inout ) ;
+
+X-FUNCTION: Status XIUngrabButton (
+ Display* display,
+ int deviceid,
+ int button,
+ Window grab_window,
+ int num_modifiers,
+ XIGrabModifiers* modifiers ) ;
+
+X-FUNCTION: Status XIUngrabKeycode (
+ Display* display,
+ int deviceid,
+ int keycode,
+ Window grab_window,
+ int num_modifiers,
+ XIGrabModifiers* modifiers ) ;
+
+X-FUNCTION: Status XIUngrabEnter (
+ Display* display,
+ int deviceid,
+ Window grab_window,
+ int num_modifiers,
+ XIGrabModifiers* modifiers ) ;
+
+X-FUNCTION: Status XIUngrabFocusIn (
+ Display* display,
+ int deviceid,
+ Window grab_window,
+ int num_modifiers,
+ XIGrabModifiers* modifiers ) ;
+
+X-FUNCTION: Atom* XIListProperties (
+ Display* display,
+ int deviceid,
+ int* num_props_return ) ;
+
+X-FUNCTION: void XIChangeProperty (
+ Display* display,
+ int deviceid,
+ Atom property,
+ Atom type,
+ int format,
+ int mode,
+ uchar* data,
+ int num_items ) ;
+
+X-FUNCTION: void XIDeleteProperty (
+ Display* display,
+ int deviceid,
+ Atom property ) ;
+
+X-FUNCTION: Status XIGetProperty (
+ Display* display,
+ int deviceid,
+ Atom property,
+ long offset,
+ long length,
+ Bool delete_property,
+ Atom type,
+ Atom* type_return,
+ int* format_return,
+ ulong* num_items_return,
+ ulong* bytes_after_return,
+ uchar** data ) ;
+
+X-FUNCTION: void XIFreeDeviceInfo ( XIDeviceInfo* info ) ;
+