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 "dixevents.h"
|
||||
|
||||
#include <X11/extensions/XI.h>
|
||||
#include <X11/extensions/XIproto.h>
|
||||
#include "exglobals.h"
|
||||
#include "exevents.h"
|
||||
|
@ -157,6 +158,8 @@ EnableDevice(DeviceIntPtr dev)
|
|||
{
|
||||
DeviceIntPtr *prev;
|
||||
int ret;
|
||||
DeviceIntRec dummyDev;
|
||||
devicePresenceNotify ev;
|
||||
|
||||
for (prev = &inputInfo.off_devices;
|
||||
*prev && (*prev != dev);
|
||||
|
@ -175,6 +178,14 @@ EnableDevice(DeviceIntPtr dev)
|
|||
*prev = dev;
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -182,6 +193,8 @@ Bool
|
|||
DisableDevice(DeviceIntPtr dev)
|
||||
{
|
||||
DeviceIntPtr *prev;
|
||||
DeviceIntRec dummyDev;
|
||||
devicePresenceNotify ev;
|
||||
|
||||
for (prev = &inputInfo.devices;
|
||||
*prev && (*prev != dev);
|
||||
|
@ -194,6 +207,15 @@ DisableDevice(DeviceIntPtr dev)
|
|||
*prev = dev->next;
|
||||
dev->next = inputInfo.off_devices;
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -212,8 +234,8 @@ ActivateDevice(DeviceIntPtr dev)
|
|||
|
||||
ev.type = DevicePresenceNotify;
|
||||
ev.time = currentTime.milliseconds;
|
||||
ev.devchange = 0;
|
||||
ev.deviceid = 0;
|
||||
ev.devchange = DeviceAdded;
|
||||
ev.deviceid = dev->id;
|
||||
dummyDev.id = 0;
|
||||
SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
|
||||
(xEvent *) &ev, 1);
|
||||
|
@ -547,12 +569,15 @@ RemoveDevice(DeviceIntPtr dev)
|
|||
int ret = BadMatch;
|
||||
devicePresenceNotify ev;
|
||||
DeviceIntRec dummyDev;
|
||||
int deviceid;
|
||||
|
||||
DebugF("(dix) removing device %d\n", dev->id);
|
||||
|
||||
if (!dev || dev == inputInfo.keyboard || dev == inputInfo.pointer)
|
||||
return BadImplementation;
|
||||
|
||||
deviceid = dev->id;
|
||||
|
||||
prev = NULL;
|
||||
for (tmp = inputInfo.devices; tmp; (prev = tmp), (tmp = next)) {
|
||||
next = tmp->next;
|
||||
|
@ -587,8 +612,8 @@ RemoveDevice(DeviceIntPtr dev)
|
|||
inputInfo.numDevices--;
|
||||
ev.type = DevicePresenceNotify;
|
||||
ev.time = currentTime.milliseconds;
|
||||
ev.devchange = 0;
|
||||
ev.deviceid = 0;
|
||||
ev.devchange = DeviceRemoved;
|
||||
ev.deviceid = deviceid;
|
||||
dummyDev.id = 0;
|
||||
SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
|
||||
(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 */
|
||||
|
|
|
@ -187,6 +187,8 @@ void xf86InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, int minval,
|
|||
void xf86InitValuatorDefaults(DeviceIntPtr dev, int axnum);
|
||||
void xf86AddEnabledDevice(InputInfoPtr pInfo);
|
||||
void xf86RemoveEnabledDevice(InputInfoPtr pInfo);
|
||||
void xf86DisableDevice(DeviceIntPtr dev);
|
||||
void xf86EnableDevice(DeviceIntPtr dev);
|
||||
|
||||
/* xf86Helper.c */
|
||||
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,
|
||||
pointer extraOpts);
|
||||
|
||||
|
||||
/* Legacy hatred */
|
||||
#define SendCoreEvents 59
|
||||
#define DontSendCoreEvents 60
|
||||
|
|
Loading…
Reference in New Issue
Block a user