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 }