diff --git a/basis/x11/xinput2/ffi/authors.txt b/basis/x11/xinput2/ffi/authors.txt new file mode 100644 index 0000000000..8e15658eb6 --- /dev/null +++ b/basis/x11/xinput2/ffi/authors.txt @@ -0,0 +1 @@ +Niklas Waern diff --git a/basis/x11/xinput2/ffi/ffi.factor b/basis/x11/xinput2/ffi/ffi.factor new file mode 100644 index 0000000000..65ed73106a --- /dev/null +++ b/basis/x11/xinput2/ffi/ffi.factor @@ -0,0 +1,482 @@ +! 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 ) ; +