From: Thierry Reding <tred...@nvidia.com> In legacy mode, the user can interrupt kmscube by pressing the return key. Implement the same behaviour for atomic mode.
Signed-off-by: Thierry Reding <tred...@nvidia.com> --- drm-atomic.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/drm-atomic.c b/drm-atomic.c index a68f036a9aab..30f978e1d873 100644 --- a/drm-atomic.c +++ b/drm-atomic.c @@ -27,6 +27,7 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#include <sys/select.h> #include "common.h" #include "drm-common.h" @@ -179,6 +180,8 @@ static int atomic_run(const struct gbm *gbm, const struct egl *egl) struct drm_fb *fb; uint32_t i = 0; uint32_t flags = DRM_MODE_ATOMIC_NONBLOCK; + struct timeval timeout; + fd_set fds; int ret; if (egl_check(egl, eglDupNativeFenceFDANDROID) || @@ -274,6 +277,28 @@ static int atomic_run(const struct gbm *gbm, const struct egl *egl) /* Allow a modeset change for the first commit only. */ flags &= ~(DRM_MODE_ATOMIC_ALLOW_MODESET); + + /* watch for user interruption */ + FD_ZERO(&fds); + FD_SET(0, &fds); + memset(&timeout, 0, sizeof(timeout)); + + ret = select(1, &fds, NULL, NULL, &timeout); + if (ret < 0) { + printf("select() failed: %s\n", strerror(errno)); + break; + } + + /* + * select() will immediately timeout if there was no user + * interrupt because of the 0 timeout. However, that's an + * expected situation, not an error, so we just ignore it + * here. + */ + if (FD_ISSET(0, &fds)) { + printf("user interrupted!\n"); + break; + } } return ret; -- 2.16.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev