diff options
author | Adam Jackson <ajax@redhat.com> | 2015-12-02 10:42:36 -0500 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2015-12-02 10:42:36 -0500 |
commit | 2e3d9623ae3f562f81e513cb183ca1b1b68f279c (patch) | |
tree | 06cd13e2960766b10b91202f0029a9b7de2bd61b /hw/xfree86/common/xf86Events.c | |
parent | 7b02f0b87ec2fa0cc5a65307a1fd55c671cec884 (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.c | 67 |
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; |