chiark / gitweb /
96ba1051a6097b746e4fe8a60d58488868d09454
[chiark-utils.git] / cprogs / xacpi-simple.c
1 /*
2  */
3
4 #include <stdio.h>
5 #include <math.h>
6 #include <stdlib.h>
7 #include <unistd.h>
8
9 #include <X11/Xlib.h>
10
11 static void fail(const char *m) {
12   fprintf(stderr,"error: %s\n", m);
13   sleep(5);
14   exit(-1);
15 }
16 static void badusage(void) { fail("bad usage"); }
17
18 static Display *d;
19 static Window w;
20 static int width, height;
21 static GC gc_green, gc_red, gc_yellow, gc_blue;
22 static Colormap cmap;
23 static int screen;
24
25 #define TOP      60
26 #define BOTTOM 3600
27
28 static void refresh(void);
29
30 static void geometry(void) {
31   int dummy;
32   Window dummyw;
33   
34   XGetGeometry(d,w, &dummyw,&dummy,&dummy, &width,&height, &dummy,&dummy);
35   refresh();
36 }
37
38 static void show(double fill_norm, double ratepersec_norm, int ac) {
39   double elap, then;
40   int i, leftmost_lit;
41
42   for (i=0; i<height; i++) {
43     elap= !i ? 0 :
44       height==2 ? BOTTOM :
45       TOP * exp( (double)i / (height-2) * log( (double)BOTTOM/TOP ) );
46     
47     then= fill_norm + ratepersec_norm * elap;
48
49     leftmost_lit= then <= 0 ? -1 :
50       then >= 1.0 ? width :
51       width * then;
52
53 fprintf(stderr," width=%d height=%d i=%d elap=%f then=%f leftmost_lit=%d\n",
54         (unsigned long)w,
55         width,height,i,then,leftmost_lit);
56     if (leftmost_lit >= 0)
57       XDrawLine(d, w, ac ? gc_blue : gc_green, 0,i, leftmost_lit,i);
58     if (leftmost_lit < width)
59       XDrawLine(d, w, then >= 0 ? gc_red : gc_yellow,
60                 leftmost_lit+1,i, width,i);
61   }
62 }
63
64 static void refresh(void) {
65   show(0.3, 0.5/3600, 1);
66 }
67
68 static void colour(GC *gc_r, const char *name) {
69   XColor xc;
70   Status st;
71   XGCValues gcv;
72   
73   st= XAllocNamedColor(d,cmap,name,&xc,&xc);
74   if (!st) fail("couldn't allocate colour");
75   
76   gcv.function= GXcopy;
77   gcv.line_width= 1;
78   gcv.foreground= xc.pixel;
79   *gc_r= XCreateGC(d,w, GCFunction|GCForeground|GCLineWidth, &gcv);
80 }
81
82 int main(int argc, const char *const *argv) {
83   const char *windowid_string;
84   char *ep;
85   XEvent ev;
86   
87   d= XOpenDisplay(0); if (!d) fail("could not open display");
88
89   if (!argv[0] || argv[1])
90     badusage();
91
92   /*  if (!(windowid_string= getenv("WINDOWID")))
93     badusage();  w= strtoul(windowid_string,&ep,0);
94   if (*ep) badusage();
95
96 */
97
98   screen= DefaultScreen(d);
99
100   w= XCreateSimpleWindow(d,DefaultRootWindow(d),0,0,50,50,0,0,0);
101
102   cmap= DefaultColormap(d,screen);
103   
104   colour(&gc_green,  "green");
105   colour(&gc_red,    "darkred");
106   colour(&gc_yellow, "yellow");
107   colour(&gc_blue,   "blue");
108
109   XSelectInput(d,w, ExposureMask|VisibilityChangeMask);
110   XMapWindow(d,w);
111   
112   geometry();
113   
114   for (;;) {
115     XNextEvent(d,&ev);
116     geometry();
117   }
118 }