tspoon.c - spoon - [fork] customized build of spoon, the dwm status utility
 (HTM) git clone git://src.adamsgaard.dk/spoon
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
       tspoon.c (2171B)
       ---
            1 #include <err.h>
            2 #include <limits.h>
            3 #include <stdio.h>
            4 #include <stdlib.h>
            5 #include <unistd.h>
            6 
            7 #include <X11/keysym.h>
            8 #include <X11/Xlib.h>
            9 
           10 #include "arg.h"
           11 #include "util.h"
           12 
           13 int battread(void *, char *, size_t);
           14 int cpuread(void *, char *, size_t);
           15 int dateread(void *, char *, size_t);
           16 int dummyread(void *, char *, size_t);
           17 int loadread(void *, char *, size_t);
           18 int mixread(void *, char *, size_t);
           19 int mpdread(void *, char *, size_t);
           20 int tempread(void *, char *, size_t);
           21 int wifiread(void *, char *, size_t);
           22 int xkblayoutread(void *, char *, size_t);
           23 int fileread(void *, char *, size_t);
           24 int keyread(void *, char *, size_t);
           25 int netspeedread(void *, char *, size_t);
           26 int brightnessread(void *, char *, size_t);
           27 int countread(void *, char *, size_t);
           28 int fileexists(void *, char *, size_t);
           29 
           30 struct ent {
           31         char *fmt;
           32         int (*read)(void *, char *, size_t);
           33         void *arg;
           34 };
           35 
           36 #include "types.h"
           37 #include "config.h"
           38 
           39 char *argv0;
           40 int single;
           41 int tty;
           42 
           43 int
           44 dummyread(void *arg, char *buf, size_t len)
           45 {
           46         buf[0] = '\0';
           47         return 0;
           48 }
           49 
           50 void
           51 entcat(char *line, size_t len)
           52 {
           53         char buf[LINE_MAX];
           54         char *s, *e;
           55         struct ent *ent;
           56         int ret, i;
           57 
           58         s = line;
           59         e = line + len;
           60         for (i = 0; i < LEN(ents); i++) {
           61                 ent = &ents[i];
           62                 ret = ent->read(ent->arg, buf, sizeof(buf));
           63                 if (ret == 0 && s < e)
           64                         s += snprintf(s, e - s, ent->fmt, buf);
           65         }
           66 }
           67 
           68 void
           69 xloop(void)
           70 {
           71         char line[LINE_MAX];
           72         Display *dpy;
           73 
           74         dpy = XOpenDisplay(NULL);
           75         if (dpy == NULL)
           76                 errx(1, "cannot open display");
           77         for (;;) {
           78                 entcat(line, sizeof(line));
           79                 XStoreName(dpy, DefaultRootWindow(dpy), line);
           80                 XSync(dpy, False);
           81                 if (single)
           82                         break;
           83                 sleep(delay);
           84         }
           85 }
           86 
           87 void
           88 ttyloop(void)
           89 {
           90         char line[LINE_MAX];
           91 
           92         for (;;) {
           93                 entcat(line, sizeof(line));
           94                 puts(line);
           95                 fflush(stdout);
           96                 if (single)
           97                         break;
           98                 sleep(delay);
           99         }
          100 }
          101 
          102 void
          103 usage(void)
          104 {
          105         fprintf(stderr, "%s: [-st]\n", argv0);
          106         fprintf(stderr, "  -s        One shot mode\n");
          107         fprintf(stderr, "  -t        Use TTY backend\n");
          108         exit(1);
          109 }
          110 
          111 int
          112 main(int argc, char *argv[])
          113 {
          114         char *end;
          115 
          116         ARGBEGIN {
          117         case 's':
          118                 single = 1;
          119                 break;
          120         case 't':
          121                 tty = 1;
          122                 break;
          123         default:
          124                 usage();
          125         } ARGEND
          126 
          127         if (tty)
          128                 ttyloop();
          129         else
          130                 xloop();
          131         return 0;
          132 }