diff options
| author | Dana Jansens <danakj@orodu.net> | 2002-04-11 03:20:38 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2002-04-11 03:20:38 +0000 |
| commit | dfc5f034581f5a26cba5c4811500438f89f0634a (patch) | |
| tree | efb1e3af799383aa5835a736cabf658d18db4be5 /util/bsetroot.cc | |
| parent | 17532e906b1dd6340bb1eccd2d9724643637958b (diff) | |
Initial revision
Diffstat (limited to 'util/bsetroot.cc')
| -rw-r--r-- | util/bsetroot.cc | 296 |
1 files changed, 296 insertions, 0 deletions
diff --git a/util/bsetroot.cc b/util/bsetroot.cc new file mode 100644 index 00000000..f0912cab --- /dev/null +++ b/util/bsetroot.cc @@ -0,0 +1,296 @@ +#ifdef HAVE_CONFIG_H +# include "../config.h" +#endif // HAVE_CONFIG_H + +#ifdef STDC_HEADERS +# include <string.h> +# include <stdlib.h> +#endif // STDC_HEADERS + +#ifdef HAVE_STDIO_H +# include <stdio.h> +#endif // HAVE_STDIO_H + +#include "../src/i18n.h" +#include "bsetroot.h" + + +bsetroot::bsetroot(int argc, char **argv, char *dpy_name) + : BaseDisplay(argv[0], dpy_name) +{ + pixmaps = (Pixmap *) 0; + grad = fore = back = (char *) 0; + + Bool mod = False, sol = False, grd = False; + int mod_x = 0, mod_y = 0, i = 0; + + img_ctrl = new BImageControl*[getNumberOfScreens()]; + for (; i < getNumberOfScreens(); i++) + img_ctrl[i] = new BImageControl(this, getScreenInfo(i), True); + + for (i = 1; i < argc; i++) { + if (! strcmp("-help", argv[i])) { + usage(); + } else if ((! strcmp("-fg", argv[i])) || + (! strcmp("-foreground", argv[i])) || + (! strcmp("-from", argv[i]))) { + if ((++i) >= argc) usage(1); + + fore = argv[i]; + } else if ((! strcmp("-bg", argv[i])) || + (! strcmp("-background", argv[i])) || + (! strcmp("-to", argv[i]))) { + if ((++i) >= argc) usage(1); + + back = argv[i]; + } else if (! strcmp("-solid", argv[i])) { + if ((++i) >= argc) usage(1); + + fore = argv[i]; + sol = True; + } else if (! strcmp("-mod", argv[i])) { + if ((++i) >= argc) usage(); + + mod_x = atoi(argv[i]); + + if ((++i) >= argc) usage(); + + mod_y = atoi(argv[i]); + + if (mod_x < 1) mod_x = 1; + if (mod_y < 1) mod_y = 1; + + mod = True; + } else if (! strcmp("-gradient", argv[i])) { + if ((++i) >= argc) usage(); + + grad = argv[i]; + grd = True; + } else if (! strcmp("-display", argv[i])) { + // -display passed through tests ealier... we just skip it now + i++; + } else + usage(); + } + + if ((mod + sol + grd) != True) { + fprintf(stderr, + i18n-> + getMessage( +#ifdef NLS + bsetrootSet, bsetrootMustSpecify, +#else // !NLS + 0, 0, +#endif // NLS + "%s: error: must specify one of: -solid, -mod, -gradient\n"), + getApplicationName()); + + usage(2); + } + + if (sol && fore) solid(); + else if (mod && mod_x && mod_y && fore && back) modula(mod_x, mod_y); + else if (grd && grad && fore && back) gradient(); + else usage(); +} + + +bsetroot::~bsetroot(void) { + XKillClient(getXDisplay(), AllTemporary); + + if (pixmaps) { + int i; + for (i = 0; i < getNumberOfScreens(); i++) + if (pixmaps[i] != None) { + XSetCloseDownMode(getXDisplay(), RetainTemporary); + break; + } + + delete [] pixmaps; + } + + if (img_ctrl) { + int i = 0; + for (; i < getNumberOfScreens(); i++) + delete img_ctrl[i]; + + delete [] img_ctrl; + } +} + + +void bsetroot::solid(void) { + register int screen = 0; + + for (; screen < getNumberOfScreens(); screen++) { + BColor c; + + img_ctrl[screen]->parseColor(&c, fore); + if (! c.isAllocated()) c.setPixel(BlackPixel(getXDisplay(), screen)); + + XSetWindowBackground(getXDisplay(), getScreenInfo(screen)->getRootWindow(), + c.getPixel()); + XClearWindow(getXDisplay(), getScreenInfo(screen)->getRootWindow()); + } +} + + +void bsetroot::modula(int x, int y) { + char data[32]; + long pattern; + + register int screen, i; + + pixmaps = new Pixmap[getNumberOfScreens()]; + + for (pattern = 0, screen = 0; screen < getNumberOfScreens(); screen++) { + for (i = 0; i < 16; i++) { + pattern <<= 1; + if ((i % x) == 0) + pattern |= 0x0001; + } + + for (i = 0; i < 16; i++) + if ((i % y) == 0) { + data[(i * 2)] = (char) 0xff; + data[(i * 2) + 1] = (char) 0xff; + } else { + data[(i * 2)] = pattern & 0xff; + data[(i * 2) + 1] = (pattern >> 8) & 0xff; + } + + BColor f, b; + GC gc; + Pixmap bitmap; + XGCValues gcv; + + bitmap = + XCreateBitmapFromData(getXDisplay(), + getScreenInfo(screen)->getRootWindow(), data, + 16, 16); + + img_ctrl[screen]->parseColor(&f, fore); + img_ctrl[screen]->parseColor(&b, back); + + if (! f.isAllocated()) f.setPixel(WhitePixel(getXDisplay(), screen)); + if (! b.isAllocated()) b.setPixel(BlackPixel(getXDisplay(), screen)); + + gcv.foreground = f.getPixel(); + gcv.background = b.getPixel(); + + gc = XCreateGC(getXDisplay(), getScreenInfo(screen)->getRootWindow(), + GCForeground | GCBackground, &gcv); + + pixmaps[screen] = + XCreatePixmap(getXDisplay(), getScreenInfo(screen)->getRootWindow(), + 16, 16, getScreenInfo(screen)->getDepth()); + + XCopyPlane(getXDisplay(), bitmap, pixmaps[screen], gc, + 0, 0, 16, 16, 0, 0, 1l); + XSetWindowBackgroundPixmap(getXDisplay(), + getScreenInfo(screen)->getRootWindow(), + pixmaps[screen]); + XClearWindow(getXDisplay(), getScreenInfo(screen)->getRootWindow()); + + XFreeGC(getXDisplay(), gc); + XFreePixmap(getXDisplay(), bitmap); + + if (! (getScreenInfo(screen)->getVisual()->c_class & 1)) { + XFreePixmap(getXDisplay(), pixmaps[screen]); + pixmaps[screen] = None; + } + } +} + + +void bsetroot::gradient(void) { + register int screen; + + pixmaps = new Pixmap[getNumberOfScreens()]; + + for (screen = 0; screen < getNumberOfScreens(); screen++) { + BTexture texture; + img_ctrl[screen]->parseTexture(&texture, grad); + img_ctrl[screen]->parseColor(texture.getColor(), fore); + img_ctrl[screen]->parseColor(texture.getColorTo(), back); + + if (! texture.getColor()->isAllocated()) + texture.getColor()->setPixel(WhitePixel(getXDisplay(), screen)); + if (! texture.getColorTo()->isAllocated()) + texture.getColorTo()->setPixel(BlackPixel(getXDisplay(), screen)); + + pixmaps[screen] = + img_ctrl[screen]->renderImage(getScreenInfo(screen)->getWidth(), + getScreenInfo(screen)->getHeight(), + &texture); + + XSetWindowBackgroundPixmap(getXDisplay(), + getScreenInfo(screen)->getRootWindow(), + pixmaps[screen]); + XClearWindow(getXDisplay(), getScreenInfo(screen)->getRootWindow()); + + if (! (getScreenInfo(screen)->getVisual()->c_class & 1)) { + img_ctrl[screen]->removeImage(pixmaps[screen]); + img_ctrl[screen]->timeout(); + pixmaps[screen] = None; + } + } +} + + +void bsetroot::usage(int exit_code) { + fprintf(stderr, + i18n-> + getMessage( +#ifdef NLS + bsetrootSet, bsetrootUsage, +#else // !NLS + 0, 0, +#endif // NLS + "%s 2.0 : (c) 1997-1999 Brad Hughes\n\n" + " -display <string> display connection\n" + " -mod <x> <y> modula pattern\n" + " -foreground, -fg <color> modula foreground color\n" + " -background, -bg <color> modula background color\n\n" + " -gradient <texture> gradient texture\n" + " -from <color> gradient start color\n" + " -to <color> gradient end color\n\n" + " -solid <color> solid color\n\n" + " -help print this help text and exit\n"), + getApplicationName()); + + exit(exit_code); +} + + +int main(int argc, char **argv) { + char *display_name = (char *) 0; + int i = 1; + + NLSInit("openbox.cat"); + + for (; i < argc; i++) { + if (! strcmp(argv[i], "-display")) { + // check for -display option + + if ((++i) >= argc) { + fprintf(stderr, + i18n->getMessage( +#ifdef NLS + mainSet, mainDISPLAYRequiresArg, +#else // !NLS + 0, 0, +#endif // NLS + "error: '-display' requires an argument\n")); + + ::exit(1); + } + + display_name = argv[i]; + } + } + + bsetroot app(argc, argv, display_name); + + return 0; +} |
