ttimer.c - stopwatch - simple timer for console or x root window
 (HTM) git clone git://src.adamsgaard.dk/stopwatch
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       ttimer.c (2241B)
       ---
            1 #include <stdio.h>
            2 #include <stdlib.h>
            3 #include <limits.h>
            4 #include <unistd.h>
            5 #include <time.h>
            6 #include <string.h>
            7 #include <err.h>
            8 #include <X11/Xlib.h>
            9 
           10 #include "timeutil.h"
           11 
           12 char *argv0;
           13 
           14 void
           15 usage(void)
           16 {
           17         errx(1, "usage: %s [-p prefix] [-P postfix] [-i interval] [-x] HH:MM:SS", argv0);
           18 }
           19 
           20 void
           21 print_loop(unsigned int interval, char *prefix, char *postfix, time_t duration)
           22 {
           23         char buf[LINE_MAX];
           24         time_t t_start = time(NULL);
           25         time_t t_elapsed = 0;
           26 
           27         while ((t_elapsed = time(NULL) - t_start) < duration) {
           28                 format_time(buf, sizeof(buf), duration - t_elapsed, prefix, postfix);
           29                 printf("\r%s ", buf);
           30                 fflush(stdout);
           31                 sleep(interval);
           32         }
           33         printf("\a\n");
           34 }
           35 
           36 void
           37 xroot_loop(unsigned int interval, char *prefix, char *postfix, time_t duration)
           38 {
           39         Display *dpy;
           40         char buf[LINE_MAX];
           41         time_t t_start = time(NULL);
           42         time_t t_elapsed = 0;
           43 
           44         dpy = XOpenDisplay(NULL);
           45         if (dpy == NULL)
           46                 errx(1, "cannot open display");
           47         while ((t_elapsed = time(NULL) - t_start) < duration) {
           48                 format_time(buf, sizeof(buf), duration - t_elapsed, prefix, postfix);
           49                 XStoreName(dpy, DefaultRootWindow(dpy), buf);
           50                 XSync(dpy, False);
           51                 sleep(interval);
           52         }
           53         snprintf(buf, sizeof(buf), "%sEND%s", prefix, postfix);
           54         XStoreName(dpy, DefaultRootWindow(dpy), buf);
           55         XSync(dpy, False);
           56 }
           57 
           58 int
           59 main(int argc, char *argv[])
           60 {
           61         int h, m, s;
           62         time_t duration;
           63         int ch, xflag = 0;
           64         unsigned int interval = 1;
           65         char prefix[LINE_MAX] = "", postfix[LINE_MAX] = "";
           66         const char *errstr;
           67 
           68         argv0 = *argv;
           69 
           70         while ((ch = getopt(argc, argv, "p:P:i:x")) != -1) {
           71                 switch (ch) {
           72                 case 'p':
           73                         strlcpy(prefix, optarg, sizeof(prefix));
           74                         break;
           75                 case 'P':
           76                         strlcpy(postfix, optarg, sizeof(postfix));
           77                         break;
           78                 case 'i':
           79                         interval = strtonum(optarg, 1, UINT_MAX, &errstr);
           80                         if (errstr != NULL)
           81                                 errx(1, "interval is %s: %s", errstr, optarg);
           82                         break;
           83                 case 'x':
           84                         xflag = 1;
           85                         break;
           86                 default:
           87                         usage();
           88                 }
           89         }
           90         argc -= optind;
           91         argv += optind;
           92         if (argc != 1)
           93                 usage();
           94 
           95         if (sscanf(argv[0], "%d:%d:%d", &h, &m, &s) != 3)
           96                 errx(2, "could not parse time in HH:MM:SS format");
           97         duration = h * 3600 + m * 60 + s;
           98 
           99         if (xflag)
          100                 xroot_loop(interval, prefix, postfix, duration);
          101         else
          102                 print_loop(interval, prefix, postfix, duration);
          103 
          104         return 0;
          105 }