There should be a nicer way to quit than ctrl-c. This lets you press q to
quit. (and also checks for esc, for users who don't read the manual.)
Index: grdc.6
===================================================================
RCS file: /cvs/src/games/grdc/grdc.6,v
retrieving revision 1.10
diff -u -p -r1.10 grdc.6
--- grdc.6 17 Nov 2014 22:14:25 -0000 1.10
+++ grdc.6 6 Jan 2019 02:37:05 -0000
@@ -27,6 +27,9 @@ flag makes digits scroll as they change.
If the terminal is too slow to keep up,
.Nm
will skip seconds.
+Pressing the
+.Li q
+key will exit.
.Sh AUTHORS
.An -nosplit
.An Amos Shapir ,
Index: grdc.c
===================================================================
RCS file: /cvs/src/games/grdc/grdc.c,v
retrieving revision 1.29
diff -u -p -r1.29 grdc.c
--- grdc.c 23 Aug 2018 06:25:01 -0000 1.29
+++ grdc.c 6 Jan 2019 02:45:46 -0000
@@ -18,7 +18,9 @@
#include <limits.h>
#include <signal.h>
#include <stdlib.h>
+#include <stdio.h>
#include <time.h>
+#include <poll.h>
#include <unistd.h>
#define XLENGTH 58
@@ -59,10 +61,11 @@ int
main(int argc, char *argv[])
{
long t, a;
- int i, j, s, k;
+ int i, j, s, k, rv;
int scrol;
int n = 0;
struct timespec delay, end;
+ struct pollfd pfd;
const char *errstr;
long scroldelay = 50000000;
int xbase;
@@ -106,6 +109,9 @@ main(int argc, char *argv[])
signal(SIGWINCH, sigresize);
signal(SIGCONT, sigresize); /* for resizes during suspend */
+ pfd.fd = STDIN_FILENO;
+ pfd.events = POLLIN;
+
cbreak();
noecho();
@@ -224,7 +230,15 @@ main(int argc, char *argv[])
/* want scrolling to END on the second */
if (scrol && !wintoosmall)
delay.tv_nsec -= 5 * scroldelay;
- nanosleep(&delay, NULL);
+ rv = ppoll(&pfd, 1, &delay, NULL);
+ if (rv == 1) {
+ char q = 0;
+ read(STDIN_FILENO, &q, 1);
+ if (q == 'q' || q == 'Q' || q == '\x1b') {
+ n = 1;
+ end.tv_sec = now.tv_sec;
+ }
+ }
now.tv_sec++;
if (sigtermed) {