diff options
Diffstat (limited to 'tools/obsetroot.cc')
| -rw-r--r-- | tools/obsetroot.cc | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/tools/obsetroot.cc b/tools/obsetroot.cc new file mode 100644 index 00000000..286a61e4 --- /dev/null +++ b/tools/obsetroot.cc @@ -0,0 +1,66 @@ +#include <otk/otk.hh> + +int main(int argc, char **argv) +{ + otk::initialize(); + + int screen = DefaultScreen(**otk::display); + + Pixmap old; + Window root = otk::display->screenInfo(screen)->rootWindow(); + + otk::Surface *s = new otk::Surface(screen, + otk::display->screenInfo(screen)->size()); + otk::RenderTexture *tx = new otk::RenderTexture(screen, false, + otk::RenderTexture::Flat, + otk::RenderTexture::Bevel1, + false, + otk::RenderTexture::Solid, + false, 0x202020, 0x0000ff, + 0, 0); + otk::display->renderControl(screen)->drawBackground(*s, *tx); + + otk::display->grab(); + + otk::display->setIgnoreErrors(true); + // get the current pixmap and free it + if (otk::Property::get(root, otk::Property::atoms.rootpmapid, + otk::Property::atoms.pixmap, &old) && old) { + XKillClient(**otk::display, old); + XSync(**otk::display, false); + XFreePixmap(**otk::display, old); + } + if (otk::Property::get(root, otk::Property::atoms.esetrootid, + otk::Property::atoms.pixmap, &old) && old) + XFreePixmap(**otk::display, old); + otk::display->setIgnoreErrors(false); + + // XSetWindowBackground(**display, root, color.pixel()); + + // don't kill us when someone wants to change the background!! + Pixmap pixmap = XCreatePixmap(**otk::display, root, s->size().width(), + s->size().height(), + otk::display->screenInfo(screen)->depth()); + XCopyArea(**otk::display, s->pixmap(), pixmap, + DefaultGC(**otk::display, screen), 0, 0, + s->size().width(), s->size().height(), 0, 0); + + // set the new pixmap + XSetWindowBackgroundPixmap(**otk::display, root, pixmap); + XClearWindow(**otk::display, root); + + otk::Property::set(root, otk::Property::atoms.rootpmapid, + otk::Property::atoms.pixmap, pixmap); + otk::Property::set(root, otk::Property::atoms.esetrootid, + otk::Property::atoms.pixmap, pixmap); + + otk::display->ungrab(); + + delete tx; + delete s; + + XSetCloseDownMode(**otk::display, RetainPermanent); + XKillClient(**otk::display, AllTemporary); + + otk::destroy(); +} |
