---
name: "XOpenDevice"
section: "3x"
platform: "linux"
package: "libxi-dev"
version: "4.3.0.dfsg.1-14sarge7"
release: "Debian 3.1 (Sarge)"
platforms: ["linux"]
url: "https://new.carta.tech/XOpenDevice/3x"
---

# XOpenDevice(3x)

open or close an extension input device

## NAME

XOpenDevice, XCloseDevice - open or close an extension input device

## SYNTAX

XDevice \*XOpenDevice(Display \**display*, XID *device\_id*);

XCloseDevice(Display \**display*, XDevice \**device*);

## ARGUMENTS

- *display*

  *Specifies the connection to the X server.*

- *device\_id*

  *Specifies the id of the device to be opened*

- *device*

  *Specifies the device to be closed*

## DESCRIPTION

*The XOpenDevice* *request makes an input device accessible to a client through input extension* *protocol requests.  If successful, it returns a pointer to an* **XDevice** *structure.*

*The XCloseDevice request makes an input device inaccessible to a*  *client through input extension protocol requests.  Before terminating,* *and client that has opened input devices through the input extension* *should close them via CloseDevice.*

*When a client makes an XCloseDevice request,* *any active grabs that the client has on the device are*  *released.  Any event selections that the client has are deleted, as well as* *any passive grabs.  If the requesting client is the last client accessing* *the device, the server may disable all access by X to the device.*

*XOpenDevice and XCloseDevice can generate a BadDevice*  *error.*

## STRUCTURES

*The* *XDevice structure returned by XOpenDevice contains:*

```
typedef struct {
	XID device_id;
	int num_classes;
	XInputClassInfo *classes;
} XDevice;
```

*The classes field is a pointer to an array of XInputClassInfo structures.* *Each element of this array contains an event type base for a class of input* *supported by the specified device.  The num\_classes field indicates the* *number of elements in the classes array.*

*The* *XInputClassInfo* *structure contains:*

```
typedef struct {
	unsigned char input_class;
	unsigned char event_type_base;
} XInputClassInfo;
```

*The input\_class field identifies one class of input* *supported by the device.  Defined types include KeyClass,* *ButtonClass, ValuatorClass, ProximityClass,* *FeedbackClass, FocusClass, and OtherClass.* *The event\_type\_base identifies the event type of the first event in that class.*

*The information contained in the XInputClassInfo structure is used* *by macros to obtain the event classes that clients use in making* *XSelectExtensionEvent requests.  Currently defined macros include* *DeviceKeyPress, DeviceKeyRelease, DeviceButtonPress,*  *DeviceButtonRelese, DeviceMotionNotify, DeviceFocusIn,*  *DeviceFocusOut, ProximityIn, ProximityOut,*  *DeviceStateNotify, DeviceMappiingNotify,*  *ChangeDeviceNotify, DevicePointerMotionHint,*  *DeviceButton1Motion, DeviceButton2Motion, DeviceButton3Motion,* *DeviceButton4Motion, DeviceButton5Motion, DeviceButtonMotion,* *DeviceOwnerGrabButton, DeviceButtonPressGrab, and* *NoExtensionEvent.*

*To obtain the proper event class for a particular device, one of the above* *macros is invoked using the XDevice structure for that device.  For* *example,*

```
DeviceKeyPress (*device, type, eventclass);
```

*returns the DeviceKeyPress event type and the eventclass for*  *DeviceKeyPress events from the specified device.*

*This eventclass can then be used in an XSelectExtensionEvent*  *request to ask the server to send DeviceKeyPress events from this device.*  *When a selected event is received via XNextEvent, the type can be*  *used for comparison with the type in the event.*

## DIAGNOSTICS

- *BadDevice*

  *An invalid device was specified.  The specified device does not exist,* *or is the X keyboard or X pointer.  This error may* *also occur if some other client has caused the specified device to become* *the X keyboard or X pointer device via the XChangeKeyboardDevice or* *XChangePointerDevice requests.*

## SEE ALSO

*Programming with Xlib*
