diff semiconginev2/thirdparty/x11/xinput.nim @ 1218:56781cc0fc7c compiletime-tests

did: renamge main package
author sam <sam@basx.dev>
date Wed, 17 Jul 2024 21:01:37 +0700
parents semicongine/old/thirdparty/x11/xinput.nim@239adab121a3
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/semiconginev2/thirdparty/x11/xinput.nim	Wed Jul 17 21:01:37 2024 +0700
@@ -0,0 +1,732 @@
+import x, xlib, xi
+
+const xNeedWidePrototypes {.booldefine.} = defined(posix)
+
+const
+  deviceKeyPress* = 0
+  deviceKeyRelease* = 1
+  deviceButtonPress* = 0
+  deviceButtonRelease* = 1
+  deviceMotionNotify* = 0
+  deviceFocusIn* = 0
+  deviceFocusOut* = 1
+  proximityIn* = 0
+  proximityOut* = 1
+  deviceStateNotify* = 0
+  deviceMappingNotify* = 1
+  changeDeviceNotify* = 2
+
+  propertyNotify* = 6
+
+template FindTypeAndClass*(d, `type`, class, classid, offset: untyped) =
+  var i: cint
+  var ip: PXInputClassInfo
+  `type` = 0
+  class = 0
+  i = 0
+  ip = (cast[PXDevice](d)).classes
+  while i < (cast[PXDevice](d)).num_classes:
+    if ip.input_class == classid:
+      `type` = ip.event_type_base + offset
+      class = (cast[PXDevice](d)).device_id shl 8 or `type`
+    inc(i)
+    inc(ip)
+
+template DeviceKeyPress*(d, `type`, class: untyped): untyped =
+  FindTypeAndClass(d, `type`, class, KeyClass, deviceKeyPress)
+
+template DeviceKeyRelease*(d, `type`, class: untyped): untyped =
+  FindTypeAndClass(d, `type`, class, KeyClass, deviceKeyRelease)
+
+template DeviceButtonPress*(d, `type`, class: untyped): untyped =
+  FindTypeAndClass(d, `type`, class, ButtonClass, deviceButtonPress)
+
+template DeviceButtonRelease*(d, `type`, class: untyped): untyped =
+  FindTypeAndClass(d, `type`, class, ButtonClass, deviceButtonRelease)
+
+template DeviceMotionNotify*(d, `type`, class: untyped): untyped =
+  FindTypeAndClass(d, `type`, class, ValuatorClass, deviceMotionNotify)
+
+template DeviceFocusIn*(d, `type`, class: untyped): untyped =
+  FindTypeAndClass(d, `type`, class, FocusClass, deviceFocusIn)
+
+template DeviceFocusOut*(d, `type`, class: untyped): untyped =
+  FindTypeAndClass(d, `type`, class, FocusClass, deviceFocusOut)
+
+template ProximityIn*(d, `type`, class: untyped): untyped =
+  FindTypeAndClass(d, `type`, class, ProximityClass, proximityIn)
+
+template ProximityOut*(d, `type`, class: untyped): untyped =
+  FindTypeAndClass(d, `type`, class, ProximityClass, proximityOut)
+
+template DeviceStateNotify*(d, `type`, class: untyped): untyped =
+  FindTypeAndClass(d, `type`, class, OtherClass, deviceStateNotify)
+
+template DeviceMappingNotify*(d, `type`, class: untyped): untyped =
+  FindTypeAndClass(d, `type`, class, OtherClass, deviceMappingNotify)
+
+template ChangeDeviceNotify*(d, `type`, class: untyped): untyped =
+  FindTypeAndClass(d, `type`, class, OtherClass, changeDeviceNotify)
+
+template DevicePropertyNotify*(d, `type`, class: untyped): untyped =
+  FindTypeAndClass(d, `type`, class, OtherClass, propertyNotify)
+
+template DevicePointerMotionHint*(d, `type`, class: untyped) =
+  class = (cast[PXDevice](d)).device_id shl 8 or devicePointerMotionHint
+
+template DeviceButton1Motion*(d, `type`, class: untyped) =
+  class = (cast[PXDevice](d)).device_id shl 8 or deviceButton1Motion
+
+template DeviceButton2Motion*(d, `type`, class: untyped) =
+  class = (cast[PXDevice](d)).device_id shl 8 or deviceButton2Motion
+
+template DeviceButton3Motion*(d, `type`, class: untyped) =
+  class = (cast[PXDevice](d)).device_id shl 8 or deviceButton3Motion
+
+template DeviceButton4Motion*(d, `type`, class: untyped) =
+  class = (cast[PXDevice](d)).device_id shl 8 or deviceButton4Motion
+
+template DeviceButton5Motion*(d, `type`, class: untyped) =
+  class = (cast[PXDevice](d)).device_id shl 8 or deviceButton5Motion
+
+template DeviceButtonMotion*(d, `type`, class: untyped) =
+  class = (cast[PXDevice](d)).device_id shl 8 or deviceButtonMotion
+
+template DeviceOwnerGrabButton*(d, `type`, class: untyped) =
+  class = (cast[PXDevice](d)).device_id shl 8 or deviceOwnerGrabButton
+
+template DeviceButtonPressGrab*(d, `type`, class: untyped) =
+  class = (cast[PXDevice](d)).device_id shl 8 or deviceButtonGrab
+
+template NoExtensionEvent*(d, `type`, class: untyped) =
+  class = (cast[PXDevice](d)).device_id shl 8 or noExtensionEvent
+
+template DevicePresence*(dpy, `type`, class: untyped) =
+  `type` = XiGetDevicePresenceNotifyEvent(dpy)
+  class = (0x00010000 or devicePresence)
+
+##  Errors
+
+template BadDevice*(dpy, error: untyped): untyped =
+  xibaddevice(dpy, addr(error))
+
+template BadClass*(dpy, error: untyped): untyped =
+  xibadclass(dpy, addr(error))
+
+template BadEvent*(dpy, error: untyped): untyped =
+  xibadevent(dpy, addr(error))
+
+template BadMode*(dpy, error: untyped): untyped =
+  xibadmode(dpy, addr(error))
+
+template DeviceBusy*(dpy, error: untyped): untyped =
+  xidevicebusy(dpy, addr(error))
+
+type
+  PXDeviceKeyEvent* = ptr XDeviceKeyEvent
+  XDeviceKeyEvent* {.final.} = object
+    ##  DeviceKey events.  These events are sent by input devices that
+    ##  support input class Keys.
+    ##  The location of the X pointer is reported in the coordinate
+    ##  fields of the x,y and x_root,y_root fields.
+    `type`*: cint ##  of event
+    serial*: culong ##  # of last request processed
+    send_event*: XBool ##  true if from SendEvent request
+    display*: PDisplay ##  Display the event was read from
+    window*: Window ##  "event" window reported relative to
+    deviceid*: XID
+    root*: Window ##  root window event occured on
+    subwindow*: Window ##  child window
+    time*: Time ##  milliseconds
+    x*: cint
+    y*: cint ##  x, y coordinates in event window
+    x_root*: cint ##  coordinates relative to root
+    y_root*: cint ##  coordinates relative to root
+    state*: cuint ##  key or button mask
+    keycode*: cuint ##  detail
+    same_screen*: XBool ##  same screen flag
+    device_state*: cuint ##  device key or button mask
+    axes_count*: cuchar
+    first_axis*: cuchar
+    axis_data*: array[6, cint]
+
+  PXDeviceKeyPressedEvent* = PXDeviceKeyEvent
+  XDeviceKeyPressedEvent* = XDeviceKeyEvent
+
+  PXDeviceKeyReleasedEvent* = PXDeviceKeyEvent
+  XDeviceKeyReleasedEvent* = XDeviceKeyEvent
+
+  PXDeviceButtonEvent* = ptr XDeviceButtonEvent
+  XDeviceButtonEvent* {.final.} = object
+    ##  DeviceButton events.  These events are sent by extension devices
+    ##  that support input class Buttons.
+    `type`*: cint ##  of event
+    serial*: culong ##  # of last request processed by server
+    send_event*: XBool ##  true if from a SendEvent request
+    display*: PDisplay ##  Display the event was read from
+    window*: Window ##  "event" window reported relative to
+    deviceid*: XID
+    root*: Window ##  root window that the event occured on
+    subwindow*: Window ##  child window
+    time*: Time ##  milliseconds
+    x*: cint
+    y*: cint ##  x, y coordinates in event window
+    x_root*: cint ##  coordinates relative to root
+    y_root*: cint ##  coordinates relative to root
+    state*: cuint ##  key or button mask
+    button*: cuint ##  detail
+    same_screen*: XBool ##  same screen flag
+    device_state*: cuint ##  device key or button mask
+    axes_count*: cuchar
+    first_axis*: cuchar
+    axis_data*: array[6, cint]
+
+  PXDeviceButtonPressedEvent* = PXDeviceButtonEvent
+  XDeviceButtonPressedEvent* = XDeviceButtonEvent
+
+  PXDeviceButtonReleasedEvent* = PXDeviceButtonEvent
+  XDeviceButtonReleasedEvent* = XDeviceButtonEvent
+
+  PXDeviceMotionEvent* = ptr XDeviceMotionEvent
+  XDeviceMotionEvent* {.final.} = object
+    ##  DeviceMotionNotify event.  These events are sent by extension devices
+    ##  that support input class Valuators.
+    `type`*: cint ##  of event
+    serial*: culong ##  # of last request processed by server
+    send_event*: XBool ##  true if from a SendEvent request
+    display*: PDisplay ##  Display the event was read from
+    window*: Window ##  "event" window reported relative to
+    deviceid*: XID
+    root*: Window ##  root window that the event occured on
+    subwindow*: Window ##  child window
+    time*: Time ##  milliseconds
+    x*: cint
+    y*: cint ##  x, y coordinates in event window
+    x_root*: cint ##  coordinates relative to root
+    y_root*: cint ##  coordinates relative to root
+    state*: cuint ##  key or button mask
+    is_hint*: char ##  detail
+    same_screen*: XBool ##  same screen flag
+    device_state*: cuint ##  device key or button mask
+    axes_count*: cuchar
+    first_axis*: cuchar
+    axis_data*: array[6, cint]
+
+  PXDeviceFocusChangeEvent* = ptr XDeviceFocusChangeEvent
+  XDeviceFocusChangeEvent* {.final.} = object
+    ##  DeviceFocusChange events.  These events are sent when the focus
+    ##  of an extension device that can be focused is changed.
+    `type`*: cint ##  of event
+    serial*: culong ##  # of last request processed by server
+    send_event*: XBool ##  true if from a SendEvent request
+    display*: PDisplay ##  Display the event was read from
+    window*: Window ##  "event" window reported relative to
+    deviceid*: XID
+    mode*: cint ##  NotifyNormal, NotifyGrab, NotifyUngrab
+    detail*: cint ##
+                    ##  NotifyAncestor, NotifyVirtual, NotifyInferior,
+                    ##  NotifyNonLinear,NotifyNonLinearVirtual, NotifyPointer,
+                    ##  NotifyPointerRoot, NotifyDetailNone
+                    ##
+    time*: Time
+
+  PXDeviceFocusInEvent* = PXDeviceFocusChangeEvent
+  XDeviceFocusInEvent* = XDeviceFocusChangeEvent
+
+  PXDeviceFocusOutEvent* = PXDeviceFocusChangeEvent
+  XDeviceFocusOutEvent* = XDeviceFocusChangeEvent
+
+  PXProximityNotifyEvent* = ptr XProximityNotifyEvent
+  XProximityNotifyEvent* {.final.} = object
+    ##  ProximityNotify events.  These events are sent by those absolute
+    ##  positioning devices that are capable of generating proximity information.
+    `type`*: cint ##  ProximityIn or ProximityOut
+    serial*: culong ##  # of last request processed by server
+    send_event*: XBool ##  true if this came from a SendEvent request
+    display*: PDisplay ##  Display the event was read from
+    window*: Window
+    deviceid*: XID
+    root*: Window
+    subwindow*: Window
+    time*: Time
+    x*: cint
+    y*: cint
+    x_root*: cint
+    y_root*: cint
+    state*: cuint
+    same_screen*: XBool
+    device_state*: cuint ##  device key or button mask
+    axes_count*: cuchar
+    first_axis*: cuchar
+    axis_data*: array[6, cint]
+
+  PXProximityInEvent* = PXProximityNotifyEvent
+  XProximityInEvent* = XProximityNotifyEvent
+
+  PXProximityOutEvent* = PXProximityNotifyEvent
+  XProximityOutEvent* = XProximityNotifyEvent
+
+  PXInputClass* = ptr XInputClass
+  XInputClass* {.final.} = object
+    class*: cuchar
+    length*: cuchar
+
+  PXDeviceStateNotifyEvent* = ptr XDeviceStateNotifyEvent
+  XDeviceStateNotifyEvent* {.final.} = object
+    ##  DeviceStateNotify events are generated on EnterWindow and FocusIn
+    ##  for those clients who have selected DeviceState.
+    `type`*: cint
+    serial*: culong ##  # of last request processed by server
+    send_event*: XBool ##  true if this came from a SendEvent request
+    display*: PDisplay ##  Display the event was read from
+    window*: Window
+    deviceid*: XID
+    time*: Time
+    num_classes*: cint
+    data*: array[64, char]
+
+  PXValuatorStatus* = ptr XValuatorStatus
+  XValuatorStatus* {.final.} = object
+    class*: cuchar
+    length*: cuchar
+    num_valuators*: cuchar
+    mode*: cuchar
+    valuators*: array[6, cint]
+
+  PXKeyStatus* = ptr XKeyStatus
+  XKeyStatus* {.final.} = object
+    class*: cuchar
+    length*: cuchar
+    num_keys*: cshort
+    keys*: array[32, char]
+
+  PXButtonStatus* = ptr XButtonStatus
+  XButtonStatus* {.final.} = object
+    class*: cuchar
+    length*: cuchar
+    num_buttons*: cshort
+    buttons*: array[32, char]
+
+  PXDeviceMappingEvent* = ptr XDeviceMappingEvent
+  XDeviceMappingEvent* {.final.} = object
+    ##  DeviceMappingNotify event.  This event is sent when the key mapping,
+    ##  modifier mapping, or button mapping of an extension device is changed.
+    `type`*: cint
+    serial*: culong ##  # of last request processed by server
+    send_event*: XBool ##  true if this came from a SendEvent request
+    display*: PDisplay ##  Display the event was read from
+    window*: Window ##  unused
+    deviceid*: XID
+    time*: Time
+    request*: cint ##  one of MappingModifier, MappingKeyboard,
+                     ##  MappingPointer
+    first_keycode*: cint ##  first keycode
+    count*: cint ##  defines range of change w. first_keycode
+
+  PXChangeDeviceNotifyEvent* = ptr XChangeDeviceNotifyEvent
+  XChangeDeviceNotifyEvent* {.final.} = object
+    ##  ChangeDeviceNotify event.  This event is sent when an
+    ##  XChangeKeyboard or XChangePointer request is made.
+    `type`*: cint
+    serial*: culong ##  # of last request processed by server
+    send_event*: XBool ##  true if this came from a SendEvent request
+    display*: PDisplay ##  Display the event was read from
+    window*: Window ##  unused
+    deviceid*: XID
+    time*: Time
+    request*: cint ##  NewPointer or NewKeyboard
+
+  PXDevicePresenceNotifyEvent* = ptr XDevicePresenceNotifyEvent
+  XDevicePresenceNotifyEvent* {.final.} = object
+    ##  DevicePresenceNotify event.  This event is sent when the list of
+    ##  input devices changes, in which case devchange will be false, and
+    ##  no information about the change will be contained in the event;
+    ##  the client should use XListInputDevices() to learn what has changed.
+    ##
+    ##  If devchange is true, an attribute that the server believes is
+    ##  important has changed on a device, and the client should use
+    ##  XGetDeviceControl to examine the device.  If control is non-zero,
+    ##  then that control has changed meaningfully.
+    `type`*: cint
+    serial*: culong ##  # of last request processed by server
+    send_event*: XBool ##  true if this came from a SendEvent request
+    display*: PDisplay ##  Display the event was read from
+    window*: Window ##  unused
+    time*: Time
+    devchange*: XBool
+    deviceid*: XID
+    control*: XID
+
+  PXDevicePropertyNotifyEvent* = ptr XDevicePropertyNotifyEvent
+  XDevicePropertyNotifyEvent* {.final.} = object
+    `type`*: cint
+    serial*: culong    ##  # of last request processed by server
+    send_event*: XBool ##  true if this came from a SendEvent request
+    display*: PDisplay ##  Display the event was read from
+    window*: Window    ##  unused
+    time*: Time
+    deviceid*: XID     ##  id of the device that changed
+    atom*: Atom        ##  the property that changed
+    state*: cint       ##  PropertyNewValue or PropertyDeleted
+
+  PXFeedbackState* = ptr XFeedbackState
+  XFeedbackState* {.final.} = object
+    class*: XID
+    length*: cint
+    id*: XID
+
+  PXKbdFeedbackState* = ptr XKbdFeedbackState
+  XKbdFeedbackState* {.final.} = object
+    class*: XID
+    length*: cint
+    id*: XID
+    click*: cint
+    percent*: cint
+    pitch*: cint
+    duration*: cint
+    led_mask*: cint
+    global_auto_repeat*: cint
+    auto_repeats*: array[32, char]
+
+  PXPtrFeedbackState* = ptr XPtrFeedbackState
+  XPtrFeedbackState* {.final.} = object
+    class*: XID
+    length*: cint
+    id*: XID
+    accelNum*: cint
+    accelDenom*: cint
+    threshold*: cint
+
+  PXIntegerFeedbackState* = ptr XIntegerFeedbackState
+  XIntegerFeedbackState* {.final.} = object
+    class*: XID
+    length*: cint
+    id*: XID
+    resolution*: cint
+    minVal*: cint
+    maxVal*: cint
+
+  PXStringFeedbackState* = ptr XStringFeedbackState
+  XStringFeedbackState* {.final.} = object
+    class*: XID
+    length*: cint
+    id*: XID
+    max_symbols*: cint
+    num_syms_supported*: cint
+    syms_supported*: PKeySym
+
+  PXBellFeedbackState* = ptr XBellFeedbackState
+  XBellFeedbackState* {.final.} = object
+    class*: XID
+    length*: cint
+    id*: XID
+    percent*: cint
+    pitch*: cint
+    duration*: cint
+
+  PXLedFeedbackState* = ptr XLedFeedbackState
+  XLedFeedbackState* {.final.} = object
+    class*: XID
+    length*: cint
+    id*: XID
+    led_values*: cint
+    led_mask*: cint
+
+  PXFeedbackControl* = ptr XFeedbackControl
+  XFeedbackControl* {.final.} = object
+    class*: XID
+    length*: cint
+    id*: XID
+
+  PXPtrFeedbackControl* = ptr XPtrFeedbackControl
+  XPtrFeedbackControl* {.final.} = object
+    class*: XID
+    length*: cint
+    id*: XID
+    accelNum*: cint
+    accelDenom*: cint
+    threshold*: cint
+
+  PXKbdFeedbackControl* = ptr XKbdFeedbackControl
+  XKbdFeedbackControl* {.final.} = object
+    class*: XID
+    length*: cint
+    id*: XID
+    click*: cint
+    percent*: cint
+    pitch*: cint
+    duration*: cint
+    led_mask*: cint
+    led_value*: cint
+    key*: cint
+    auto_repeat_mode*: cint
+
+  PXStringFeedbackControl* = ptr XStringFeedbackControl
+  XStringFeedbackControl* {.final.} = object
+    class*: XID
+    length*: cint
+    id*: XID
+    num_keysyms*: cint
+    syms_to_display*: PKeySym
+
+  PXIntegerFeedbackControl* = ptr XIntegerFeedbackControl
+  XIntegerFeedbackControl* {.final.} = object
+    class*: XID
+    length*: cint
+    id*: XID
+    int_to_display*: cint
+
+  PXBellFeedbackControl* = ptr XBellFeedbackControl
+  XBellFeedbackControl* {.final.} = object
+    class*: XID
+    length*: cint
+    id*: XID
+    percent*: cint
+    pitch*: cint
+    duration*: cint
+
+  PXLedFeedbackControl* = ptr XLedFeedbackControl
+  XLedFeedbackControl* {.final.} = object
+    class*: XID
+    length*: cint
+    id*: XID
+    led_mask*: cint
+    led_values*: cint
+
+  PXDeviceControl* = ptr XDeviceControl
+  XDeviceControl* {.final.} = object
+    control*: XID
+    length*: cint
+
+  PXDeviceResolutionControl* = ptr XDeviceResolutionControl
+  XDeviceResolutionControl* {.final.} = object
+    control*: XID
+    length*: cint
+    first_valuator*: cint
+    num_valuators*: cint
+    resolutions*: ptr cint
+
+  PXDeviceResolutionState* = ptr XDeviceResolutionState
+  XDeviceResolutionState* {.final.} = object
+    control*: XID
+    length*: cint
+    num_valuators*: cint
+    resolutions*: ptr cint
+    min_resolutions*: ptr cint
+    max_resolutions*: ptr cint
+
+  PXDeviceAbsCalibControl* = ptr XDeviceAbsCalibControl
+  XDeviceAbsCalibControl* {.final.} = object
+    control*: XID
+    length*: cint
+    min_x*: cint
+    max_x*: cint
+    min_y*: cint
+    max_y*: cint
+    flip_x*: cint
+    flip_y*: cint
+    rotation*: cint
+    button_threshold*: cint
+
+  PXDeviceAbsCalibState* = PXDeviceAbsCalibControl
+  XDeviceAbsCalibState* = XDeviceAbsCalibControl
+
+  PXDeviceAbsAreaControl* = ptr XDeviceAbsAreaControl
+  XDeviceAbsAreaControl* {.final.} = object
+    control*: XID
+    length*: cint
+    offset_x*: cint
+    offset_y*: cint
+    width*: cint
+    height*: cint
+    screen*: cint
+    following*: XID
+
+  PXDeviceAbsAreaState* = PXDeviceAbsAreaControl
+  XDeviceAbsAreaState* = XDeviceAbsAreaControl
+
+  PXDeviceCoreControl* = ptr XDeviceCoreControl
+  XDeviceCoreControl* {.final.} = object
+    control*: XID
+    length*: cint
+    status*: cint
+
+  PXDeviceCoreState* = ptr XDeviceCoreState
+  XDeviceCoreState* {.final.} = object
+    control*: XID
+    length*: cint
+    status*: cint
+    iscore*: cint
+
+  PXDeviceEnableControl* = ptr XDeviceEnableControl
+  XDeviceEnableControl* {.final.} = object
+    control*: XID
+    length*: cint
+    enable*: cint
+
+  PXDeviceEnableState* = PXDeviceEnableControl
+  XDeviceEnableState* = XDeviceEnableControl
+
+  PXAnyClassInfo* = ptr XAnyClassInfo
+  XAnyClassInfo* {.final.} = object
+    class*: XID
+    length*: cint
+
+  PXDeviceInfo* = ptr XDeviceInfo
+  XDeviceInfo* {.final.} = object
+    id*: XID
+    `type`*: Atom
+    name*: cstring
+    num_classes*: cint
+    use*: cint
+    inputclassinfo*: PXAnyClassInfo
+
+  PXKeyInfo* = ptr XKeyInfo
+  XKeyInfo* {.final.} = object
+    class*: XID
+    length*: cint
+    min_keycode*: cushort
+    max_keycode*: cushort
+    num_keys*: cushort
+
+  PXButtonInfo* = ptr XButtonInfo
+  XButtonInfo* {.final.} = object
+    class*: XID
+    length*: cint
+    num_buttons*: cshort
+
+  PXAxisInfo* = ptr XAxisInfo
+  XAxisInfo* {.final.} = object
+    resolution*: cint
+    min_value*: cint
+    max_value*: cint
+
+  PXValuatorInfo* = ptr XValuatorInfo
+  XValuatorInfo* {.final.} = object
+    class*: XID
+    length*: cint
+    num_axes*: cuchar
+    mode*: cuchar
+    motion_buffer*: culong
+    axes*: PXAxisInfo
+
+  PXInputClassInfo* = ptr XInputClassInfo
+  XInputClassInfo* {.final.} = object
+    input_class*: cuchar
+    event_type_base*: cuchar
+
+  PXDevice* = ptr XDevice
+  XDevice* {.final.} = object
+    device_id*: XID
+    num_classes*: cint
+    classes*: PXInputClassInfo
+
+  PXEventList* = ptr XEventList
+  XEventList* {.final.} = object
+    event_type*: XEventClass
+    device*: XID
+
+  PXDeviceTimeCoord* = ptr XDeviceTimeCoord
+  XDeviceTimeCoord* {.final.} = object
+    time*: Time
+    data*: ptr cint
+
+  PXDeviceState* = ptr XDeviceState
+  XDeviceState* {.final.} = object
+    device_id*: XID
+    num_classes*: cint
+    data*: PXInputClass
+
+  PXValuatorState* = ptr XValuatorState
+  XValuatorState* {.final.} = object
+    class*: cuchar
+    length*: cuchar
+    num_valuators*: cuchar
+    mode*: cuchar
+    valuators*: ptr cint
+
+  PXKeyState* = ptr XKeyState
+  XKeyState* {.final.} = object
+    class*: cuchar
+    length*: cuchar
+    num_keys*: cshort
+    keys*: array[32, char]
+
+  PXButtonState* = ptr XButtonState
+  XButtonState* {.final.} = object
+    class*: cuchar
+    length*: cuchar
+    num_buttons*: cshort
+    buttons*: array[32, char]
+
+
+{.push cdecl, importc, dynlib: libXi.}
+
+proc XChangeKeyboardDevice*(a1: PDisplay, a2: PXDevice): cint
+proc XChangePointerDevice*(a1: PDisplay, a2: PXDevice, a3, a4: cint): cint
+proc XGrabDevice*(a1: PDisplay, a2: PXDevice, a3: Window, a4: XBool, a5: cint,
+                 a6: ptr UncheckedArray[XEventClass], a7, a8: cint, a9: Time): cint
+proc XUngrabDevice*(a1: PDisplay, a2: PXDevice, a3: Time): cint
+proc XGrabDeviceKey*(a1: PDisplay, a2: PXDevice, a3, a4: cuint,
+                    a5: PXDevice, a6: Window, a7: XBool, a8: cuint,
+                    a9: ptr UncheckedArray[XEventClass], a10, a11: cint): cint
+proc XUngrabDeviceKey*(a1: PDisplay, a2: PXDevice, a3: cuint, a4: cuint,
+                      a5: PXDevice, a6: Window): cint
+proc XGrabDeviceButton*(a1: PDisplay, a2: PXDevice, a3: cuint, a4: cuint,
+                       a5: PXDevice, a6: Window, a7: XBool, a8: cuint,
+                       a9: ptr UncheckedArray[XEventClass], a10: cint, a11: cint): cint
+proc XUngrabDeviceButton*(a1: PDisplay, a2: PXDevice, a3: cuint, a4: cuint,
+                         a5: PXDevice, a6: Window): cint
+proc XAllowDeviceEvents*(a1: PDisplay, a2: PXDevice, a3: cint, a4: Time): cint
+proc XGetDeviceFocus*(a1: PDisplay, a2: PXDevice, a3: PWindow, a4: ptr cint,
+                     a5: ptr Time): cint
+proc XSetDeviceFocus*(a1: PDisplay, a2: PXDevice, a3: Window, a4: cint, a5: Time): cint
+proc XGetFeedbackControl*(a1: PDisplay, a2: PXDevice, a3: ptr cint): PXFeedbackState
+proc XFreeFeedbackList*(a1: PXFeedbackState)
+proc XChangeFeedbackControl*(a1: PDisplay, a2: PXDevice, a3: culong,
+                            a4: PXFeedbackControl): cint
+proc XDeviceBell*(a1: PDisplay, a2: PXDevice, a3, a4: XID, a5: cint): cint
+proc XGetDeviceKeyMapping*(a1: PDisplay, a2: PXDevice,
+  a3: (when xNeedWidePrototypes: cuint else: KeyCode),
+  a4: cint, a5: ptr cint): PKeySym
+proc XChangeDeviceKeyMapping*(a1: PDisplay, a2: PXDevice, a3: cint, a4: cint,
+                             a5: PKeySym, a6: cint): cint
+proc XGetDeviceModifierMapping*(a1: PDisplay, a2: PXDevice): PXModifierKeymap
+proc XSetDeviceModifierMapping*(a1: PDisplay, a2: PXDevice,
+                               a3: PXModifierKeymap): cint
+proc XSetDeviceButtonMapping*(a1: PDisplay, a2: PXDevice, a3: cstring, a4: cint): cint
+proc XGetDeviceButtonMapping*(a1: PDisplay, a2: PXDevice, a3: cstring, a4: cuint): cint
+proc XQueryDeviceState*(a1: PDisplay, a2: PXDevice): PXDeviceState
+proc XFreeDeviceState*(a1: PXDeviceState)
+proc XGetExtensionVersion*(a1: PDisplay, a2: cstring): PXExtensionVersion
+proc XListInputDevices*(a1: PDisplay, a2: ptr cint): PXDeviceInfo
+proc XFreeDeviceList*(a1: PXDeviceInfo)
+proc XOpenDevice*(a1: PDisplay, a2: XID): PXDevice
+proc XCloseDevice*(a1: PDisplay, a2: PXDevice): cint
+proc XSetDeviceMode*(a1: PDisplay, a2: PXDevice, a3: cint): cint
+proc XSetDeviceValuators*(a1: PDisplay, a2: PXDevice, a3: ptr cint, a4: cint, a5: cint): cint
+proc XGetDeviceControl*(a1: PDisplay, a2: PXDevice, a3: cint): PXDeviceControl
+proc XChangeDeviceControl*(a1: PDisplay, a2: PXDevice, a3: cint,
+                          a4: PXDeviceControl): cint
+proc XSelectExtensionEvent*(a1: PDisplay, a2: Window, a3: ptr UncheckedArray[XEventClass], a4: cint): cint
+proc XGetSelectedExtensionEvents*(a1: PDisplay, a2: Window, a3: ptr cint,
+                                 a4: ptr ptr UncheckedArray[XEventClass], a5: ptr cint,
+                                 a6: ptr ptr UncheckedArray[XEventClass]): cint
+proc XChangeDeviceDontPropagateList*(a1: PDisplay, a2: Window, a3: cint,
+                                    a4: ptr UncheckedArray[XEventClass], a5: cint): cint
+proc XGetDeviceDontPropagateList*(a1: PDisplay, a2: Window, a3: ptr cint): ptr UncheckedArray[XEventClass]
+proc XSendExtensionEvent*(a1: PDisplay, a2: PXDevice, a3: Window, a4: XBool, a5: cint,
+                         a6: ptr UncheckedArray[XEventClass], a7: PXEvent): Status
+proc XGetDeviceMotionEvents*(a1: PDisplay, a2: PXDevice, a3, a4: Time,
+                            a5, a6, a7: ptr cint): PXDeviceTimeCoord
+proc XFreeDeviceMotionEvents*(a1: PXDeviceTimeCoord)
+proc XFreeDeviceControl*(a1: PXDeviceControl)
+proc XListDeviceProperties*(a1: PDisplay, a2: PXDevice, a3: ptr cint): PAtom
+proc XChangeDeviceProperty*(a1: PDisplay, a2: PXDevice, a3: Atom, a4: Atom, a5: cint,
+                           a6: cint, a7: cstring, a8: cint)
+proc XDeleteDeviceProperty*(a1: PDisplay, a2: PXDevice, a3: Atom)
+proc XGetDeviceProperty*(a1: PDisplay, a2: PXDevice, a3: Atom, a4, a5: clong,
+                        a6: XBool, a7: Atom, a8: PAtom, a9: ptr cint, a10: ptr culong,
+                        a11: ptr culong, a12: ptr cstring): Status
+
+{.pop.}