From 7d4546ba5b7f2b0bc848ee1e15e0c93a70ba3d04 Mon Sep 17 00:00:00 2001 From: markt <markt> Date: Thu, 29 Jun 2006 05:05:30 +0000 Subject: Make fbsetroot set one screen at a time --- ChangeLog | 2 + util/fbsetroot.cc | 212 ++++++++++++++++++++++++------------------------------ util/fbsetroot.hh | 6 +- 3 files changed, 99 insertions(+), 121 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3d9e9d3..2c6bc8d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,8 @@ (Format: Year/Month/Day) Changes for 1.0rc2: *06/06/29: + * Make fbsetroot set one screen at a time (Mark) + util/fbsetroot.cc/hh * Fix fbsetroot segfault when DISPLAY is unset (Mark) util/fbsetroot.cc *06/06/28: diff --git a/util/fbsetroot.cc b/util/fbsetroot.cc index 24d8c50..e5ae64c 100644 --- a/util/fbsetroot.cc +++ b/util/fbsetroot.cc @@ -55,18 +55,16 @@ using namespace std; fbsetroot::fbsetroot(int argc, char **argv, char *dpy_name) : FbTk::App(dpy_name), m_app_name(argv[0]) { - pixmaps = (Pixmap *) 0; + pixmap = (Pixmap *) 0; + screen = DefaultScreen(FbTk::App::instance()->display()); grad = fore = back = (char *) 0; bool mod = false, sol = false, grd = false; - int mod_x = 0, mod_y = 0, i = 0; + int mod_x = 0, mod_y = 0, i = 1; - img_ctrl = new FbTk::ImageControl*[ScreenCount(display())]; - for (; i < ScreenCount(display()); i++) { - img_ctrl[i] = new FbTk::ImageControl(i, true); - } + img_ctrl = new FbTk::ImageControl(screen); - for (i = 1; i < argc; i++) { + for (; i < argc; i++) { if (! strcmp("-help", argv[i])) { usage(); @@ -127,8 +125,6 @@ fbsetroot::fbsetroot(int argc, char **argv, char *dpy_name) exit(2); } - num_screens = ScreenCount(display()); - if (sol && fore) solid(); else if (mod && mod_x && mod_y && fore && back) @@ -144,18 +140,13 @@ fbsetroot::fbsetroot(int argc, char **argv, char *dpy_name) fbsetroot::~fbsetroot() { XKillClient(display(), AllTemporary); - if (pixmaps) { // should always be true + if (pixmap) { // should always be true XSetCloseDownMode(display(), RetainTemporary); - delete [] pixmaps; + delete pixmap; } - if (img_ctrl != 0) { - for (int i=0; i < num_screens; i++) - delete img_ctrl[i]; - - delete [] img_ctrl; - } + delete img_ctrl; } /** @@ -209,34 +200,27 @@ void fbsetroot::setRootAtoms(Pixmap pixmap, int screen) { Draws pixmaps with a single color */ void fbsetroot::solid() { - register int screen = 0; - - pixmaps = new Pixmap[ScreenCount(display())]; - - for (; screen < ScreenCount(display()); screen++) { + FbTk::Color c(fore, screen); + if (! c.isAllocated()) + c.setPixel(BlackPixel(display(), screen)); - FbTk::Color c(fore, screen); - if (! c.isAllocated()) - c.setPixel(BlackPixel(display(), screen)); - - FbRootWindow root(screen); + FbRootWindow root(screen); - FbTk::GContext gc(root); - gc.setForeground(c); + FbTk::GContext gc(root); + gc.setForeground(c); - pixmaps[screen] = XCreatePixmap(display(), - root.window(), - root.width(), root.height(), - root.depth()); + pixmap = new Pixmap(XCreatePixmap(display(), + root.window(), + root.width(), root.height(), + root.depth())); - XFillRectangle(display(), pixmaps[screen], gc.gc(), 0, 0, - root.width(), root.height()); + XFillRectangle(display(), *pixmap, gc.gc(), 0, 0, + root.width(), root.height()); - setRootAtoms(pixmaps[screen], screen); + setRootAtoms(*pixmap, screen); - root.setBackgroundPixmap(pixmaps[screen]); - root.clear(); - } + root.setBackgroundPixmap(*pixmap); + root.clear(); } /** @@ -245,77 +229,73 @@ void fbsetroot::solid() { */ void fbsetroot::modula(int x, int y) { char data[32]; - long pattern; + long pattern = 0; - register int screen, i; + register int i; - pixmaps = new Pixmap[ScreenCount(display())]; - - for (pattern = 0, screen = 0; screen < ScreenCount(display()); screen++) { - FbRootWindow root(screen); + FbRootWindow root(screen); - for (i = 0; i < 16; i++) { - pattern <<= 1; - if ((i % x) == 0) - pattern |= 0x0001; - } + 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; - } + 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; } + } - Pixmap bitmap, r_bitmap; + Pixmap bitmap, r_bitmap; - bitmap = XCreateBitmapFromData(display(), - root.window(), data, 16, 16); + bitmap = XCreateBitmapFromData(display(), + root.window(), data, 16, 16); - // bitmap used as tile, needs to have the same depth as background pixmap - r_bitmap = XCreatePixmap(display(), - root.window(), 16, 16, - root.depth()); + // bitmap used as tile, needs to have the same depth as background pixmap + r_bitmap = XCreatePixmap(display(), + root.window(), 16, 16, + root.depth()); - FbTk::Color f(fore, screen), b(back, screen); + FbTk::Color f(fore, screen), b(back, screen); - if (! f.isAllocated()) - f.setPixel(WhitePixel(display(), screen)); - if (! b.isAllocated()) - b.setPixel(BlackPixel(display(), screen)); + if (! f.isAllocated()) + f.setPixel(WhitePixel(display(), screen)); + if (! b.isAllocated()) + b.setPixel(BlackPixel(display(), screen)); - FbTk::GContext gc(root); + FbTk::GContext gc(root); - gc.setForeground(f); - gc.setBackground(b); + gc.setForeground(f); + gc.setBackground(b); - // copying bitmap to the one going to be used as tile - XCopyPlane(display(), bitmap, r_bitmap, gc.gc(), - 0, 0, 16, 16, 0, 0, 1l); + // copying bitmap to the one going to be used as tile + XCopyPlane(display(), bitmap, r_bitmap, gc.gc(), + 0, 0, 16, 16, 0, 0, 1l); - gc.setTile(r_bitmap); - gc.setFillStyle(FillTiled); + gc.setTile(r_bitmap); + gc.setFillStyle(FillTiled); - pixmaps[screen] = XCreatePixmap(display(), - root.window(), - root.width(), root.height(), - root.depth()); + pixmap = new Pixmap(XCreatePixmap(display(), + root.window(), + root.width(), root.height(), + root.depth())); - XFillRectangle(display(), pixmaps[screen], gc.gc(), 0, 0, - root.width(), root.height()); + XFillRectangle(display(), *pixmap, gc.gc(), 0, 0, + root.width(), root.height()); - setRootAtoms(pixmaps[screen], screen); - root.setBackgroundPixmap(pixmaps[screen]); - root.clear(); + setRootAtoms(*pixmap, screen); + root.setBackgroundPixmap(*pixmap); + root.clear(); - XFreePixmap(display(), bitmap); - XFreePixmap(display(), r_bitmap); - } + XFreePixmap(display(), bitmap); + XFreePixmap(display(), r_bitmap); } /** @@ -326,52 +306,48 @@ void fbsetroot::gradient() { // get crashed somewhere on the way causing apps like XChat chrashing // as the pixmap has been destroyed Pixmap tmp; - pixmaps = new Pixmap[ScreenCount(display())]; // we must insert gradient text string texture_value = grad ? grad : "solid"; texture_value.insert(0, "gradient "); FbTk::Texture texture; texture.setFromString(texture_value.c_str()); - - for (int screen = 0; screen < ScreenCount(display()); screen++) { - FbRootWindow root(screen); + FbRootWindow root(screen); - FbTk::GContext gc(root); - texture.color().setFromString(fore, screen); - texture.colorTo().setFromString(back, screen); + FbTk::GContext gc(root); + texture.color().setFromString(fore, screen); + texture.colorTo().setFromString(back, screen); - if (! texture.color().isAllocated()) - texture.color().setPixel(WhitePixel(display(), screen)); - if (! texture.colorTo().isAllocated()) - texture.colorTo().setPixel(BlackPixel(display(), screen)); + if (! texture.color().isAllocated()) + texture.color().setPixel(WhitePixel(display(), screen)); - tmp = img_ctrl[screen]->renderImage(root.width(), root.height(), - texture); + if (! texture.colorTo().isAllocated()) + texture.colorTo().setPixel(BlackPixel(display(), screen)); - pixmaps[screen] = XCreatePixmap(display(), - root.window(), - root.width(), root.height(), - root.depth()); + tmp = img_ctrl->renderImage(root.width(), root.height(), texture); - - XCopyArea(display(), tmp, pixmaps[screen], gc.gc(), 0, 0, - root.width(), root.height(), - 0, 0); + pixmap = new Pixmap(XCreatePixmap(display(), + root.window(), + root.width(), root.height(), + root.depth())); - setRootAtoms(pixmaps[screen], screen); - root.setBackgroundPixmap(pixmaps[screen]); - root.clear(); + XCopyArea(display(), tmp, *pixmap, gc.gc(), 0, 0, + root.width(), root.height(), + 0, 0); - if (! (root.visual()->c_class & 1)) { - img_ctrl[screen]->removeImage(tmp); - img_ctrl[screen]->cleanCache(); - } + setRootAtoms(*pixmap, screen); + root.setBackgroundPixmap(*pixmap); + root.clear(); + + if (! (root.visual()->c_class & 1)) { + img_ctrl->removeImage(tmp); + img_ctrl->cleanCache(); } + } /** diff --git a/util/fbsetroot.hh b/util/fbsetroot.hh index 21edaa9..6deb4b6 100644 --- a/util/fbsetroot.hh +++ b/util/fbsetroot.hh @@ -43,11 +43,11 @@ public: void setRootAtoms(Pixmap pixmap, int screen); private: - FbTk::ImageControl **img_ctrl; - Pixmap *pixmaps; + FbTk::ImageControl *img_ctrl; + Pixmap *pixmap; + int screen; char *fore, *back, *grad; - int num_screens; char *m_app_name; }; -- cgit v0.11.2