tstopwatch.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
       ---
       tstopwatch.c (1724B)
       ---
            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()
           16 {
           17         errx(1, "usage: %s [-p prefix] [-P postfix] [-i interval] [-x]", argv0);
           18 }
           19 
           20 void
           21 print_loop(unsigned int interval, char *prefix, char *postfix)
           22 {
           23         char buf[LINE_MAX];
           24         time_t t_start = time(NULL);
           25 
           26         while (1) {
           27                 format_time(buf, sizeof(buf), time(NULL) - t_start, prefix, postfix);
           28                 printf("\r%s", buf);
           29                 fflush(stdout);
           30                 sleep(interval);
           31         }
           32 }
           33 
           34 void
           35 xroot_loop(unsigned int interval, char *prefix, char *postfix)
           36 {
           37         Display *dpy;
           38         char buf[LINE_MAX];
           39         time_t t_start = time(NULL);
           40 
           41         dpy = XOpenDisplay(NULL);
           42         if (dpy == NULL)
           43                 errx(1, "cannot open display");
           44         while (1) {
           45                 format_time(buf, sizeof(buf), time(NULL) - t_start, prefix, postfix);
           46                 XStoreName(dpy, DefaultRootWindow(dpy), buf);
           47                 XSync(dpy, False);
           48                 sleep(interval);
           49         }
           50 }
           51 
           52 int
           53 main(int argc, char *argv[])
           54 {
           55         int ch, xflag = 0;
           56         unsigned int interval = 1;
           57         char prefix[LINE_MAX] = "", postfix[LINE_MAX] = "";
           58         const char *errstr;
           59 
           60         argv0 = *argv;
           61 
           62         while ((ch = getopt(argc, argv, "p:P:i:x")) != -1) {
           63                 switch (ch) {
           64                 case 'p':
           65                         strlcpy(prefix, optarg, sizeof(prefix));
           66                         break;
           67                 case 'P':
           68                         strlcpy(postfix, optarg, sizeof(postfix));
           69                         break;
           70                 case 'i':
           71                         interval = strtonum(optarg, 1, UINT_MAX, &errstr);
           72                         if (errstr != NULL)
           73                                 errx(1, "interval is %s: %s", errstr, optarg);
           74                         break;
           75                 case 'x':
           76                         xflag = 1;
           77                         break;
           78                 default:
           79                         usage();
           80                 }
           81         }
           82         argc -= optind;
           83         argv += optind;
           84         if (argc > 0)
           85                 usage();
           86 
           87         if (xflag)
           88                 xroot_loop(interval, prefix, postfix);
           89         else
           90                 print_loop(interval, prefix, postfix);
           91 
           92         return 0;
           93 }