Use DevicePresence events to tell the client about enabled/disabled devices.
Include the device id in the event sent to the client.
This commit is contained in:
parent
ce099a9b78
commit
c7e2ba0c9b
|
@ -75,6 +75,7 @@ SOFTWARE.
|
||||||
#include "swaprep.h"
|
#include "swaprep.h"
|
||||||
#include "dixevents.h"
|
#include "dixevents.h"
|
||||||
|
|
||||||
|
#include <X11/extensions/XI.h>
|
||||||
#include <X11/extensions/XIproto.h>
|
#include <X11/extensions/XIproto.h>
|
||||||
#include "exglobals.h"
|
#include "exglobals.h"
|
||||||
#include "exevents.h"
|
#include "exevents.h"
|
||||||
|
@ -157,6 +158,8 @@ EnableDevice(DeviceIntPtr dev)
|
||||||
{
|
{
|
||||||
DeviceIntPtr *prev;
|
DeviceIntPtr *prev;
|
||||||
int ret;
|
int ret;
|
||||||
|
DeviceIntRec dummyDev;
|
||||||
|
devicePresenceNotify ev;
|
||||||
|
|
||||||
for (prev = &inputInfo.off_devices;
|
for (prev = &inputInfo.off_devices;
|
||||||
*prev && (*prev != dev);
|
*prev && (*prev != dev);
|
||||||
|
@ -175,6 +178,14 @@ EnableDevice(DeviceIntPtr dev)
|
||||||
*prev = dev;
|
*prev = dev;
|
||||||
dev->next = NULL;
|
dev->next = NULL;
|
||||||
|
|
||||||
|
ev.type = DevicePresenceNotify;
|
||||||
|
ev.time = currentTime.milliseconds;
|
||||||
|
ev.devchange = DeviceEnabled;
|
||||||
|
ev.deviceid = dev->id;
|
||||||
|
dummyDev.id = 0;
|
||||||
|
SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
|
||||||
|
(xEvent *) &ev, 1);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,6 +193,8 @@ Bool
|
||||||
DisableDevice(DeviceIntPtr dev)
|
DisableDevice(DeviceIntPtr dev)
|
||||||
{
|
{
|
||||||
DeviceIntPtr *prev;
|
DeviceIntPtr *prev;
|
||||||
|
DeviceIntRec dummyDev;
|
||||||
|
devicePresenceNotify ev;
|
||||||
|
|
||||||
for (prev = &inputInfo.devices;
|
for (prev = &inputInfo.devices;
|
||||||
*prev && (*prev != dev);
|
*prev && (*prev != dev);
|
||||||
|
@ -194,6 +207,15 @@ DisableDevice(DeviceIntPtr dev)
|
||||||
*prev = dev->next;
|
*prev = dev->next;
|
||||||
dev->next = inputInfo.off_devices;
|
dev->next = inputInfo.off_devices;
|
||||||
inputInfo.off_devices = dev;
|
inputInfo.off_devices = dev;
|
||||||
|
|
||||||
|
ev.type = DevicePresenceNotify;
|
||||||
|
ev.time = currentTime.milliseconds;
|
||||||
|
ev.devchange = DeviceDisabled;
|
||||||
|
ev.deviceid = dev->id;
|
||||||
|
dummyDev.id = 0;
|
||||||
|
SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
|
||||||
|
(xEvent *) &ev, 1);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,8 +234,8 @@ ActivateDevice(DeviceIntPtr dev)
|
||||||
|
|
||||||
ev.type = DevicePresenceNotify;
|
ev.type = DevicePresenceNotify;
|
||||||
ev.time = currentTime.milliseconds;
|
ev.time = currentTime.milliseconds;
|
||||||
ev.devchange = 0;
|
ev.devchange = DeviceAdded;
|
||||||
ev.deviceid = 0;
|
ev.deviceid = dev->id;
|
||||||
dummyDev.id = 0;
|
dummyDev.id = 0;
|
||||||
SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
|
SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
|
||||||
(xEvent *) &ev, 1);
|
(xEvent *) &ev, 1);
|
||||||
|
@ -547,12 +569,15 @@ RemoveDevice(DeviceIntPtr dev)
|
||||||
int ret = BadMatch;
|
int ret = BadMatch;
|
||||||
devicePresenceNotify ev;
|
devicePresenceNotify ev;
|
||||||
DeviceIntRec dummyDev;
|
DeviceIntRec dummyDev;
|
||||||
|
int deviceid;
|
||||||
|
|
||||||
DebugF("(dix) removing device %d\n", dev->id);
|
DebugF("(dix) removing device %d\n", dev->id);
|
||||||
|
|
||||||
if (!dev || dev == inputInfo.keyboard || dev == inputInfo.pointer)
|
if (!dev || dev == inputInfo.keyboard || dev == inputInfo.pointer)
|
||||||
return BadImplementation;
|
return BadImplementation;
|
||||||
|
|
||||||
|
deviceid = dev->id;
|
||||||
|
|
||||||
prev = NULL;
|
prev = NULL;
|
||||||
for (tmp = inputInfo.devices; tmp; (prev = tmp), (tmp = next)) {
|
for (tmp = inputInfo.devices; tmp; (prev = tmp), (tmp = next)) {
|
||||||
next = tmp->next;
|
next = tmp->next;
|
||||||
|
@ -587,8 +612,8 @@ RemoveDevice(DeviceIntPtr dev)
|
||||||
inputInfo.numDevices--;
|
inputInfo.numDevices--;
|
||||||
ev.type = DevicePresenceNotify;
|
ev.type = DevicePresenceNotify;
|
||||||
ev.time = currentTime.milliseconds;
|
ev.time = currentTime.milliseconds;
|
||||||
ev.devchange = 0;
|
ev.devchange = DeviceRemoved;
|
||||||
ev.deviceid = 0;
|
ev.deviceid = deviceid;
|
||||||
dummyDev.id = 0;
|
dummyDev.id = 0;
|
||||||
SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
|
SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
|
||||||
(xEvent *) &ev, 1);
|
(xEvent *) &ev, 1);
|
||||||
|
|
|
@ -764,4 +764,29 @@ xf86InitValuatorDefaults(DeviceIntPtr dev, int axnum)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deactivate a device. Call this function from the driver if you receive a
|
||||||
|
* read error or something else that spoils your day.
|
||||||
|
* Device will be moved to the off_devices list, but it will still be there
|
||||||
|
* until you really clean up after it.
|
||||||
|
* Notifies the client about an inactive device.
|
||||||
|
*/
|
||||||
|
_X_EXPORT void
|
||||||
|
xf86DisableDevice(DeviceIntPtr dev)
|
||||||
|
{
|
||||||
|
DisableDevice(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reactivate a device. Call this function from the driver if you just found
|
||||||
|
* out that the read error wasn't quite that bad after all.
|
||||||
|
* Device will be re-activated, and an event sent to the client.
|
||||||
|
*/
|
||||||
|
_X_EXPORT void
|
||||||
|
xf86EnableDevice(DeviceIntPtr dev)
|
||||||
|
{
|
||||||
|
EnableDevice(dev);
|
||||||
|
}
|
||||||
|
|
||||||
/* end of xf86Xinput.c */
|
/* end of xf86Xinput.c */
|
||||||
|
|
|
@ -187,6 +187,8 @@ void xf86InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, int minval,
|
||||||
void xf86InitValuatorDefaults(DeviceIntPtr dev, int axnum);
|
void xf86InitValuatorDefaults(DeviceIntPtr dev, int axnum);
|
||||||
void xf86AddEnabledDevice(InputInfoPtr pInfo);
|
void xf86AddEnabledDevice(InputInfoPtr pInfo);
|
||||||
void xf86RemoveEnabledDevice(InputInfoPtr pInfo);
|
void xf86RemoveEnabledDevice(InputInfoPtr pInfo);
|
||||||
|
void xf86DisableDevice(DeviceIntPtr dev);
|
||||||
|
void xf86EnableDevice(DeviceIntPtr dev);
|
||||||
|
|
||||||
/* xf86Helper.c */
|
/* xf86Helper.c */
|
||||||
void xf86AddInputDriver(InputDriverPtr driver, pointer module, int flags);
|
void xf86AddInputDriver(InputDriverPtr driver, pointer module, int flags);
|
||||||
|
@ -204,6 +206,7 @@ int xf86GetMotionEvents(DeviceIntPtr dev, xTimecoord *buff,
|
||||||
void xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts,
|
void xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts,
|
||||||
pointer extraOpts);
|
pointer extraOpts);
|
||||||
|
|
||||||
|
|
||||||
/* Legacy hatred */
|
/* Legacy hatred */
|
||||||
#define SendCoreEvents 59
|
#define SendCoreEvents 59
|
||||||
#define DontSendCoreEvents 60
|
#define DontSendCoreEvents 60
|
||||||
|
|
Loading…
Reference in New Issue