summaryrefslogtreecommitdiff
path: root/hw/xfree86/common/xf86Events.c
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2015-12-02 10:42:36 -0500
committerAdam Jackson <ajax@redhat.com>2015-12-02 10:42:36 -0500
commit2e3d9623ae3f562f81e513cb183ca1b1b68f279c (patch)
tree06cd13e2960766b10b91202f0029a9b7de2bd61b /hw/xfree86/common/xf86Events.c
parent7b02f0b87ec2fa0cc5a65307a1fd55c671cec884 (diff)
Revert "hw/xfree86: Use NotifyFd for device and other input fd wakeups"
Reported to break libinput: http://lists.freedesktop.org/archives/xorg-devel/2015-December/048091.html This reverts commit 1df07dc36ca145c59f51176d9ab2651112506d75.
Diffstat (limited to 'hw/xfree86/common/xf86Events.c')
-rw-r--r--hw/xfree86/common/xf86Events.c67
1 files changed, 41 insertions, 26 deletions
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 2db6e5b8c..709afd6f9 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -101,6 +101,8 @@ Bool VTSwitchEnabled = TRUE; /* Allows run-time disabling for
switches when using the DRI
automatic full screen mode.*/
+extern fd_set EnabledDevices;
+
#ifdef XF86PM
extern void (*xf86OSPMClose) (void);
#endif
@@ -245,6 +247,45 @@ xf86ProcessActionEvent(ActionEvent action, void *arg)
void
xf86Wakeup(void *blockData, int err, void *pReadmask)
{
+ fd_set *LastSelectMask = (fd_set *) pReadmask;
+ fd_set devicesWithInput;
+ InputInfoPtr pInfo;
+
+ if (err >= 0) {
+
+ XFD_ANDSET(&devicesWithInput, LastSelectMask, &EnabledDevices);
+ if (XFD_ANYSET(&devicesWithInput)) {
+ pInfo = xf86InputDevs;
+ while (pInfo) {
+ if (pInfo->read_input && pInfo->fd >= 0 &&
+ (FD_ISSET(pInfo->fd, &devicesWithInput) != 0)) {
+ OsBlockSIGIO();
+
+ /*
+ * Remove the descriptior from the set because more than one
+ * device may share the same file descriptor.
+ */
+ FD_CLR(pInfo->fd, &devicesWithInput);
+
+ pInfo->read_input(pInfo);
+ OsReleaseSIGIO();
+ }
+ pInfo = pInfo->next;
+ }
+ }
+ }
+
+ if (err >= 0) { /* we don't want the handlers called if select() */
+ IHPtr ih, ih_tmp; /* returned with an error condition, do we? */
+
+ nt_list_for_each_entry_safe(ih, ih_tmp, InputHandlers, next) {
+ if (ih->enabled && ih->fd >= 0 && ih->ihproc &&
+ (FD_ISSET(ih->fd, ((fd_set *) pReadmask)) != 0)) {
+ ih->ihproc(ih->fd, ih->data);
+ }
+ }
+ }
+
if (xf86VTSwitchPending())
xf86VTSwitch();
}
@@ -264,15 +305,6 @@ xf86SigioReadInput(int fd, void *closure)
errno = errno_save;
}
-static void
-xf86NotifyReadInput(int fd, int ready, void *closure)
-{
- InputInfoPtr pInfo = closure;
- OsBlockSIGIO();
- pInfo->read_input(pInfo);
- OsReleaseSIGIO();
-}
-
/*
* xf86AddEnabledDevice --
*
@@ -282,7 +314,6 @@ xf86AddEnabledDevice(InputInfoPtr pInfo)
{
if (!xf86InstallSIGIOHandler(pInfo->fd, xf86SigioReadInput, pInfo)) {
AddEnabledDevice(pInfo->fd);
- SetNotifyFd(pInfo->fd, xf86NotifyReadInput, X_NOTIFY_READ, pInfo);
}
}
@@ -295,7 +326,6 @@ xf86RemoveEnabledDevice(InputInfoPtr pInfo)
{
if (!xf86RemoveSIGIOHandler(pInfo->fd)) {
RemoveEnabledDevice(pInfo->fd);
- RemoveNotifyFd(pInfo->fd);
}
}
@@ -606,16 +636,6 @@ xf86VTSwitch(void)
/* Input handler registration */
-static void
-xf86InputHandlerNotify(int fd, int ready, void *data)
-{
- IHPtr ih = data;
-
- if (ih->enabled && ih->fd >= 0 && ih->ihproc) {
- ih->ihproc(ih->fd, ih->data);
- }
-}
-
static void *
addInputHandler(int fd, InputHandlerProc proc, void *data)
{
@@ -633,11 +653,6 @@ addInputHandler(int fd, InputHandlerProc proc, void *data)
ih->data = data;
ih->enabled = TRUE;
- if (!SetNotifyFd(fd, xf86InputHandlerNotify, X_NOTIFY_READ, ih)) {
- free(ih);
- return NULL;
- }
-
ih->next = InputHandlers;
InputHandlers = ih;