From 6dc1ae8f9bee176d953274d7501eaf898746f6c0 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 12 Apr 2017 17:36:01 +0200 Subject: exit on key press --- drmtest.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/drmtest.c b/drmtest.c index 3f78b4c..d422475 100644 --- a/drmtest.c +++ b/drmtest.c @@ -7,9 +7,12 @@ #include #include #include +#include +#include #include #include +#include #include #include @@ -346,6 +349,47 @@ static void drm_make_egl_fb(void) /* ------------------------------------------------------------------ */ +struct termios saved_attributes; +int saved_fl; + +void tty_raw(void) +{ + struct termios tattr; + + fcntl(STDIN_FILENO, F_GETFL, &saved_fl); + tcgetattr (0, &saved_attributes); + + fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); + memcpy(&tattr,&saved_attributes,sizeof(struct termios)); + tattr.c_lflag &= ~(ICANON|ECHO); + tattr.c_cc[VMIN] = 1; + tattr.c_cc[VTIME] = 0; + tcsetattr(STDIN_FILENO, TCSAFLUSH, &tattr); +} + +void tty_restore(void) +{ + fcntl(STDIN_FILENO, F_SETFL, saved_fl); + tcsetattr(STDIN_FILENO, TCSANOW, &saved_attributes); +} + +int kbd_wait(int timeout) +{ + struct timeval limit; + fd_set set; + int rc; + + FD_ZERO(&set); + FD_SET(STDIN_FILENO, &set); + limit.tv_sec = timeout; + limit.tv_usec = 0; + rc = select(STDIN_FILENO + 1, &set, NULL, NULL, + timeout ? &limit : NULL); + return rc; +} + +/* ------------------------------------------------------------------ */ + static void usage(FILE *fp) { fprintf(fp, @@ -367,7 +411,7 @@ static void usage(FILE *fp) int main(int argc, char **argv) { int card = 0; - int secs = 3; + int secs = 60; bool gl = false; char *output = NULL; int c; @@ -415,7 +459,11 @@ int main(int argc, char **argv) drm_draw_dumb_fb(); } drm_show_fb(); - sleep(secs); + + tty_raw(); + kbd_wait(secs); + tty_restore(); + drm_fini_dev(); return 0; } -- cgit