From 9e5d6ea29c33dbe924c7b6131b089af8bd1d157b Mon Sep 17 00:00:00 2001 From: Iain Patterson Date: Fri, 6 Mar 2009 10:15:48 +0000 Subject: [PATCH] First mildly functional pager The pager draws windows from the current workspace. --- pager.c | 153 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 pager.c diff --git a/pager.c b/pager.c new file mode 100644 index 0000000..2a7f9ca --- /dev/null +++ b/pager.c @@ -0,0 +1,153 @@ +/* gcc -o pager pager.c -lX11 -lXmu -ldockapp */ +#if 0 +#include +#endif +#include + +static GC lightGrayGC, darkGrayGC, windowGC[4]; + +void setup_GCs() { + XGCValues gcv; + + /* GC's */ + gcv.foreground = DAGetColor("darkGray"); + XChangeGC(DADisplay, DAClearGC, GCForeground, &gcv); + + gcv.foreground = DAGetColor("lightGray"); + gcv.graphics_exposures = False; + + lightGrayGC = XCreateGC(DADisplay, DAWindow, GCForeground|GCGraphicsExposures, &gcv); + + gcv.foreground = DAGetColor("#222222"); + darkGrayGC = XCreateGC(DADisplay, DAWindow, GCForeground|GCGraphicsExposures, &gcv); + + gcv.foreground = DAGetColor("#333333"); + windowGC[0] = XCreateGC(DADisplay, DAWindow, GCForeground|GCGraphicsExposures, &gcv); + gcv.foreground = DAGetColor("#777777"); + windowGC[1] = XCreateGC(DADisplay, DAWindow, GCForeground|GCGraphicsExposures, &gcv); + gcv.foreground = DAGetColor("#bbbbbb"); + windowGC[2] = XCreateGC(DADisplay, DAWindow, GCForeground|GCGraphicsExposures, &gcv); + gcv.foreground = DAGetColor("#ffffff"); + windowGC[3] = XCreateGC(DADisplay, DAWindow, GCForeground|GCGraphicsExposures, &gcv); +} + +void draw_relief(Pixmap pixmap, unsigned int width, unsigned int height) { + /* Drawing */ + XFillRectangle(DADisplay, pixmap, DAClearGC, 0, 0, width, height); + + XDrawLine(DADisplay, pixmap, darkGrayGC, 0, 0, 0, height - 2); + XDrawLine(DADisplay, pixmap, darkGrayGC, 1, 0, width - 1, 0); + + XDrawLine(DADisplay, pixmap, lightGrayGC, 0, height - 1, width - 1, height - 1); + XDrawLine(DADisplay, pixmap, lightGrayGC, width - 1, 1, width - 1, height - 2); +} + +void page() { + Window dockapp, root, qroot, qparent, *wins; + XWindowAttributes attr; + Pixmap pixmap; + DARect rect; + unsigned int i, nwins; + unsigned int root_width, root_height; + unsigned int dockapp_width, dockapp_height; + double scale; + + root = DefaultRootWindow(DADisplay); + root_width = DisplayWidth(DADisplay, DefaultScreen(DADisplay)); + root_height = DisplayWidth(DADisplay, DefaultScreen(DADisplay)); + + XGetWindowAttributes(DADisplay, DAGetWindow(), &attr); + dockapp_width = attr.width; + dockapp_height = attr.height; + scale = (double) root_width / (double) dockapp_width; + + pixmap = DAMakePixmap(); + draw_relief(pixmap, dockapp_width, dockapp_height); + + Picture picture = XRenderCreatePicture(DADisplay, pixmap, XRenderFindVisualFormat(DADisplay, DefaultVisual(DADisplay, DefaultScreen(DADisplay))), 0, 0); + XQueryTree(DADisplay, root, &qroot, &qparent, &wins, &nwins); + for (i = 0; i < nwins; i++) { + Window root; + + Window client = XmuClientWindow(DADisplay, wins[i]); + XGetWindowAttributes(DADisplay, client, &attr); + unsigned int x, y, width, height, border, depth; + if (attr.override_redirect) continue; + if (attr.map_state != IsViewable) continue; + + if (! XGetGeometry(DADisplay, wins[i], &root, &x, &y, &width, &height, &border, &depth)) continue; + rect.x = (double) x / scale; + rect.y = (double) y / scale; + rect.width = (double) width / scale; + rect.height = (double) height / scale; + + XFillRectangle(DADisplay, pixmap, windowGC[(int) wins[i] % 4], rect.x, rect.y, rect.width, rect.height); + + /* Thumbnail. */ +#if 0 + XRenderPictureAttributes pa; + Pixmap client_pixmap = XCreatePixmap(DADisplay, wins[i], width, height, DefaultDepth(DADisplay, DefaultScreen(DADisplay))); + //XCopyArea(DADisplay, wins[i], client_pixmap, DefaultGC(DADisplay, DefaultScreen(DADisplay)), 0, 0, width, height, 0, 0); + Picture client_picture = XRenderCreatePicture(DADisplay, client_pixmap, XRenderFindVisualFormat(DADisplay, attr.visual), CPSubwindowMode, &pa); + + XTransform xform = {{ + { XDoubleToFixed(1.0), 0, 0 }, + { 0, XDoubleToFixed(1.0), 0 }, + { 0, 0, XDoubleToFixed(scale) }, + }}; + + XRenderSetPictureFilter(DADisplay, client_picture, FilterBilinear, 0, 0); + XRenderSetPictureTransform(DADisplay, client_picture, &xform); + XRenderComposite(DADisplay, PictOpSrc, client_picture, None, picture, 0, 0, 0, 0, rect.x, rect.y, rect.width, rect.height); + XFreePixmap(DADisplay, client_pixmap); + XSync(DADisplay, False); +#endif + + XDrawLine(DADisplay, pixmap, darkGrayGC, rect.x, rect.y, rect.x, rect.y + rect.height - 2); + XDrawLine(DADisplay, pixmap, darkGrayGC, rect.x + 1, rect.y, rect.x + rect.width - 1, rect.y); + XDrawLine(DADisplay, pixmap, lightGrayGC, rect.x, rect.y + rect.height - 1, rect.x + rect.width - 1, rect.y + rect.height - 1); + XDrawLine(DADisplay, pixmap, lightGrayGC, rect.x + rect.width - 1, rect.y + 1, rect.x + rect.width - 1, rect.y + rect.height - 2); + } + + DASetPixmap(pixmap); + XFreePixmap(DADisplay, pixmap); +} + +#define DOCKAPP_SIZE 56 +#define SPEED 100 + +int main(int argc, char **argv) { + Display *display; + unsigned int root_width, root_height; + unsigned int dockapp_width, dockapp_height; + double aspect; + DACallbacks callbacks = { 0, 0, 0, 0, 0, 0, page }; + + DASetExpectedVersion(20020126); + + display = XOpenDisplay(0); + + root_width = DisplayWidth(display, DefaultScreen(display)); + root_height = DisplayHeight(display, DefaultScreen(display)); + aspect = (double) root_width / (double) root_height; + + if (root_width > root_height) { + dockapp_width = DOCKAPP_SIZE; + dockapp_height = (double) DOCKAPP_SIZE / aspect; + } + else { + dockapp_height = DOCKAPP_SIZE; + dockapp_width = (double) DOCKAPP_SIZE / aspect; + } + + DAParseArguments(argc, argv, 0, 0, "BLURB", "BLORB"); + DAOpenDisplay(0, argc, argv); + DACreateIcon("pager", dockapp_width, dockapp_height, argc, argv); + + DASetCallbacks(&callbacks); + DASetTimeout(SPEED); + + setup_GCs(); + DAShow(); + DAEventLoop(); +} -- 2.7.4