1 /* gcc -o pager pager.c -lX11 -lXmu -ldockapp */
3 #include <X11/extensions/Xrender.h>
7 static GC lightGrayGC, darkGrayGC, windowGC[4];
13 gcv.foreground = DAGetColor("darkGray");
14 XChangeGC(DADisplay, DAClearGC, GCForeground, &gcv);
16 gcv.foreground = DAGetColor("lightGray");
17 gcv.graphics_exposures = False;
19 lightGrayGC = XCreateGC(DADisplay, DAWindow, GCForeground|GCGraphicsExposures, &gcv);
21 gcv.foreground = DAGetColor("#222222");
22 darkGrayGC = XCreateGC(DADisplay, DAWindow, GCForeground|GCGraphicsExposures, &gcv);
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);
34 void draw_relief(Pixmap pixmap, unsigned int width, unsigned int height) {
36 XFillRectangle(DADisplay, pixmap, DAClearGC, 0, 0, width, height);
38 XDrawLine(DADisplay, pixmap, darkGrayGC, 0, 0, 0, height - 2);
39 XDrawLine(DADisplay, pixmap, darkGrayGC, 1, 0, width - 1, 0);
41 XDrawLine(DADisplay, pixmap, lightGrayGC, 0, height - 1, width - 1, height - 1);
42 XDrawLine(DADisplay, pixmap, lightGrayGC, width - 1, 1, width - 1, height - 2);
46 Window dockapp, root, qroot, qparent, *wins;
47 XWindowAttributes attr;
50 unsigned int i, nwins;
51 unsigned int root_width, root_height;
52 unsigned int dockapp_width, dockapp_height;
55 root = DefaultRootWindow(DADisplay);
56 root_width = DisplayWidth(DADisplay, DefaultScreen(DADisplay));
57 root_height = DisplayWidth(DADisplay, DefaultScreen(DADisplay));
59 XGetWindowAttributes(DADisplay, DAGetWindow(), &attr);
60 dockapp_width = attr.width;
61 dockapp_height = attr.height;
62 scale = (double) root_width / (double) dockapp_width;
64 pixmap = DAMakePixmap();
65 draw_relief(pixmap, dockapp_width, dockapp_height);
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++) {
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;
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;
84 XFillRectangle(DADisplay, pixmap, windowGC[(int) wins[i] % 4], rect.x, rect.y, rect.width, rect.height);
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);
94 { XDoubleToFixed(1.0), 0, 0 },
95 { 0, XDoubleToFixed(1.0), 0 },
96 { 0, 0, XDoubleToFixed(scale) },
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);
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);
113 XFreePixmap(DADisplay, pixmap);
116 #define DOCKAPP_SIZE 56
119 int main(int argc, char **argv) {
121 unsigned int root_width, root_height;
122 unsigned int dockapp_width, dockapp_height;
124 DACallbacks callbacks = { 0, 0, 0, 0, 0, 0, page };
126 DASetExpectedVersion(20020126);
128 display = XOpenDisplay(0);
130 root_width = DisplayWidth(display, DefaultScreen(display));
131 root_height = DisplayHeight(display, DefaultScreen(display));
132 aspect = (double) root_width / (double) root_height;
134 if (root_width > root_height) {
135 dockapp_width = DOCKAPP_SIZE;
136 dockapp_height = (double) DOCKAPP_SIZE / aspect;
139 dockapp_height = DOCKAPP_SIZE;
140 dockapp_width = (double) DOCKAPP_SIZE / aspect;
143 DAParseArguments(argc, argv, 0, 0, "BLURB", "BLORB");
144 DAOpenDisplay(0, argc, argv);
145 DACreateIcon("pager", dockapp_width, dockapp_height, argc, argv);
147 DASetCallbacks(&callbacks);