2a7f9ca3ace20269d836e3023cdc9220cefc8d5c
[pager.git] / pager.c
1 /* gcc -o pager pager.c -lX11 -lXmu -ldockapp */
2 #if 0
3 #include <X11/extensions/Xrender.h>
4 #endif
5 #include <dockapp.h>
6
7 static GC lightGrayGC, darkGrayGC, windowGC[4];
8
9 void setup_GCs() {
10   XGCValues gcv;
11
12   /* GC's */
13   gcv.foreground = DAGetColor("darkGray");
14   XChangeGC(DADisplay, DAClearGC, GCForeground, &gcv);
15
16   gcv.foreground = DAGetColor("lightGray");
17   gcv.graphics_exposures = False;
18
19   lightGrayGC   = XCreateGC(DADisplay, DAWindow, GCForeground|GCGraphicsExposures, &gcv);
20
21   gcv.foreground = DAGetColor("#222222");
22   darkGrayGC    =  XCreateGC(DADisplay, DAWindow, GCForeground|GCGraphicsExposures, &gcv);
23
24   gcv.foreground = DAGetColor("#333333");
25   windowGC[0] = XCreateGC(DADisplay, DAWindow, GCForeground|GCGraphicsExposures, &gcv);
26   gcv.foreground = DAGetColor("#777777");
27   windowGC[1] = XCreateGC(DADisplay, DAWindow, GCForeground|GCGraphicsExposures, &gcv);
28   gcv.foreground = DAGetColor("#bbbbbb");
29   windowGC[2] = XCreateGC(DADisplay, DAWindow, GCForeground|GCGraphicsExposures, &gcv);
30   gcv.foreground = DAGetColor("#ffffff");
31   windowGC[3] = XCreateGC(DADisplay, DAWindow, GCForeground|GCGraphicsExposures, &gcv);
32 }
33
34 void draw_relief(Pixmap pixmap, unsigned int width, unsigned int height) {
35   /* Drawing */
36   XFillRectangle(DADisplay, pixmap, DAClearGC, 0, 0, width, height);
37
38   XDrawLine(DADisplay, pixmap, darkGrayGC, 0, 0, 0, height - 2);
39   XDrawLine(DADisplay, pixmap, darkGrayGC, 1, 0, width - 1, 0);
40
41   XDrawLine(DADisplay, pixmap, lightGrayGC, 0, height - 1, width - 1, height - 1);
42   XDrawLine(DADisplay, pixmap, lightGrayGC, width - 1, 1, width - 1, height - 2);
43 }
44
45 void page() {
46   Window dockapp, root, qroot, qparent, *wins;
47   XWindowAttributes attr;
48   Pixmap pixmap;
49   DARect rect;
50   unsigned int i, nwins;
51   unsigned int root_width, root_height;
52   unsigned int dockapp_width, dockapp_height;
53   double scale;
54
55   root = DefaultRootWindow(DADisplay);
56   root_width = DisplayWidth(DADisplay, DefaultScreen(DADisplay));
57   root_height = DisplayWidth(DADisplay, DefaultScreen(DADisplay));
58
59   XGetWindowAttributes(DADisplay, DAGetWindow(), &attr);
60   dockapp_width = attr.width;
61   dockapp_height = attr.height;
62   scale = (double) root_width / (double) dockapp_width;
63
64   pixmap = DAMakePixmap();
65   draw_relief(pixmap, dockapp_width, dockapp_height);
66
67       Picture picture = XRenderCreatePicture(DADisplay, pixmap, XRenderFindVisualFormat(DADisplay, DefaultVisual(DADisplay, DefaultScreen(DADisplay))), 0, 0);
68   XQueryTree(DADisplay, root, &qroot, &qparent, &wins, &nwins);
69   for (i = 0; i < nwins; i++) {
70     Window root;
71
72     Window client = XmuClientWindow(DADisplay, wins[i]);
73     XGetWindowAttributes(DADisplay, client, &attr);
74     unsigned int x, y, width, height, border, depth;
75     if (attr.override_redirect) continue;
76     if (attr.map_state != IsViewable) continue;
77
78     if (! XGetGeometry(DADisplay, wins[i], &root, &x, &y, &width, &height, &border, &depth)) continue;
79     rect.x = (double) x / scale;
80     rect.y = (double) y / scale;
81     rect.width = (double) width / scale;
82     rect.height = (double) height / scale;
83
84     XFillRectangle(DADisplay, pixmap, windowGC[(int) wins[i] % 4], rect.x, rect.y, rect.width, rect.height);
85
86     /* Thumbnail. */
87 #if 0
88       XRenderPictureAttributes pa;
89       Pixmap client_pixmap = XCreatePixmap(DADisplay, wins[i], width, height, DefaultDepth(DADisplay, DefaultScreen(DADisplay)));
90       //XCopyArea(DADisplay, wins[i], client_pixmap, DefaultGC(DADisplay, DefaultScreen(DADisplay)), 0, 0, width, height, 0, 0);
91       Picture client_picture = XRenderCreatePicture(DADisplay, client_pixmap, XRenderFindVisualFormat(DADisplay, attr.visual), CPSubwindowMode, &pa);
92
93       XTransform xform = {{
94         { XDoubleToFixed(1.0), 0, 0 },
95         { 0, XDoubleToFixed(1.0), 0 },
96         { 0, 0, XDoubleToFixed(scale) },
97       }};
98
99       XRenderSetPictureFilter(DADisplay, client_picture, FilterBilinear, 0, 0);
100       XRenderSetPictureTransform(DADisplay, client_picture, &xform);
101       XRenderComposite(DADisplay, PictOpSrc, client_picture, None, picture, 0, 0, 0, 0, rect.x, rect.y, rect.width, rect.height);
102       XFreePixmap(DADisplay, client_pixmap);
103       XSync(DADisplay, False);
104 #endif
105
106     XDrawLine(DADisplay, pixmap, darkGrayGC, rect.x, rect.y, rect.x, rect.y + rect.height - 2);
107     XDrawLine(DADisplay, pixmap, darkGrayGC, rect.x + 1, rect.y, rect.x + rect.width - 1, rect.y);
108     XDrawLine(DADisplay, pixmap, lightGrayGC, rect.x, rect.y + rect.height - 1, rect.x + rect.width - 1, rect.y + rect.height - 1);
109     XDrawLine(DADisplay, pixmap, lightGrayGC, rect.x + rect.width - 1, rect.y + 1, rect.x + rect.width - 1, rect.y + rect.height - 2);
110   }
111
112   DASetPixmap(pixmap);
113   XFreePixmap(DADisplay, pixmap);
114 }
115
116 #define DOCKAPP_SIZE 56
117 #define SPEED 100
118
119 int main(int argc, char **argv) {
120   Display *display;
121   unsigned int root_width, root_height;
122   unsigned int dockapp_width, dockapp_height;
123   double aspect;
124   DACallbacks callbacks = { 0, 0, 0, 0, 0, 0, page };
125
126   DASetExpectedVersion(20020126);
127
128   display = XOpenDisplay(0);
129
130   root_width = DisplayWidth(display, DefaultScreen(display));
131   root_height = DisplayHeight(display, DefaultScreen(display));
132   aspect = (double) root_width / (double) root_height;
133
134   if (root_width > root_height) {
135     dockapp_width = DOCKAPP_SIZE;
136     dockapp_height = (double) DOCKAPP_SIZE / aspect;
137   }
138   else {
139     dockapp_height = DOCKAPP_SIZE;
140     dockapp_width = (double) DOCKAPP_SIZE / aspect;
141   }
142
143   DAParseArguments(argc, argv, 0, 0, "BLURB", "BLORB");
144   DAOpenDisplay(0, argc, argv);
145   DACreateIcon("pager", dockapp_width, dockapp_height, argc, argv);
146
147   DASetCallbacks(&callbacks);
148   DASetTimeout(SPEED);
149
150   setup_GCs();
151   DAShow();
152   DAEventLoop();
153 }