diff options
author | Hans De Goede <hdegoede@redhat.com> | 2016-09-29 22:55:00 +0200 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2016-11-25 08:36:44 -0500 |
commit | f46c585cbb10cf523e6164d3300e61058a0eafca (patch) | |
tree | 06e58fc4c705e21929cd8c19b405fc704dca220a | |
parent | b39262d13e036efdd9b8ebbea615dde0a1a3ca82 (diff) |
Use NotifyFd for drm fd
NotifyFd is available after API 22, and must be used after API 23.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
-rw-r--r-- | src/compat-api.h | 4 | ||||
-rw-r--r-- | src/drmmode_display.c | 25 |
2 files changed, 29 insertions, 0 deletions
diff --git a/src/compat-api.h b/src/compat-api.h index 15b92fe..80dabc1 100644 --- a/src/compat-api.h +++ b/src/compat-api.h @@ -76,6 +76,10 @@ #define SCREEN_INIT_ARGS_DECL ScreenPtr pScreen, int argc, char **argv +#if ABI_VIDEODRV_VERSION >= SET_ABI_VERSION(22,0) +#define HAVE_NOTIFY_FD 1 +#endif + #if ABI_VIDEODRV_VERSION >= SET_ABI_VERSION(23, 0) #define BLOCKHANDLER_ARGS_DECL ScreenPtr arg, pointer pTimeout #define BLOCKHANDLER_ARGS arg, pTimeout diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 3891e13..d6062ac 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -1499,6 +1499,15 @@ drmmode_uevent_fini(ScrnInfoPtr pScrn) TRACE_EXIT(); } +#if HAVE_NOTIFY_FD +static void +drmmode_notify_fd(int fd, int notify, void *data) +{ + ScrnInfoPtr scrn = data; + drmmode_ptr drmmode = drmmode_from_scrn(scrn); + drmHandleEvent(drmmode->fd, &event_context); +} +#else static void drmmode_wakeup_handler(pointer data, int err, pointer p) { @@ -1514,6 +1523,7 @@ drmmode_wakeup_handler(pointer data, int err, pointer p) if (FD_ISSET(drmmode->fd, read_mask)) drmHandleEvent(drmmode->fd, &event_context); } +#endif void drmmode_wait_for_event(ScrnInfoPtr pScrn) @@ -1529,15 +1539,30 @@ drmmode_screen_init(ScrnInfoPtr pScrn) drmmode_uevent_init(pScrn); +#if HAVE_NOTIFY_FD + SetNotifyFd(drmmode->fd, drmmode_notify_fd, X_NOTIFY_READ, pScrn); +#else AddGeneralSocket(drmmode->fd); /* Register a wakeup handler to get informed on DRM events */ RegisterBlockAndWakeupHandlers((BlockHandlerProcPtr)NoopDDA, drmmode_wakeup_handler, pScrn); +#endif } void drmmode_screen_fini(ScrnInfoPtr pScrn) { + drmmode_ptr drmmode = drmmode_from_scrn(pScrn); + +#if HAVE_NOTIFY_FD + RemoveNotifyFd(drmmode->fd); +#else + /* Unregister wakeup handler */ + RemoveBlockAndWakeupHandlers((BlockHandlerProcPtr)NoopDDA, + drmmode_wakeup_handler, pScrn); + RemoveGeneralSocket(drmmode->fd); +#endif + drmmode_uevent_fini(pScrn); } |