SVN commit 848034 by jstubbs: This code doesn't serve it's purpose, but I'd like others to have a look at it so I'm throwing it into subversion for the time being.
The purpose is to do ParentRelative background-pixmap manually. No X errors are mentioned on the console and there's no crashes but nothing is actually happening. When trying to set the background-pixmap attribute during window creation however, the creation fails and crashes - but still with no visible X errors. By the way, this rewrite is pretty much ready, other than a severe lack of comments. Will follow up later with a few questions, but if anybody would like to take a look and let me know of issues in advance, I'd greatly appreciate it. CCMAIL: plasma-devel@kde.org M +50 -0 x11embedcontainer.cpp M +3 -0 x11embedcontainer.h --- trunk/playground/base/plasma/applets/systray-refactor/core/fdo/x11embedcontainer.cpp #848033:848034 @@ -29,6 +29,7 @@ #include <QX11Info> // Xlib +#include <X11/Xutil.h> #include <X11/Xlib.h> @@ -105,6 +106,55 @@ } +void +X11EmbedContainer::paintEvent(QPaintEvent* event) +{ + QX11EmbedContainer::paintEvent(event); + + if (clientWinId()) { + Display* display = QX11Info::display(); + + XWindowAttributes attr; + XGetWindowAttributes(display, clientWinId(), &attr); + + QImage srcImage; + switch (attr.depth) { + case 32: + srcImage = QImage(size(), QImage::Format_ARGB32); + break; + case 24: + srcImage = QImage(size(), QImage::Format_RGB32); + break; + case 16: + srcImage = QImage(size(), QImage::Format_RGB16); + break; + default: + return; + } + + parentWidget()->render(&srcImage, QPoint(0, 0), geometry(), QWidget::DrawWindowBackground); + + char* data = (char*)malloc(srcImage.numBytes()); + memcpy(data, srcImage.bits(), srcImage.numBytes()); + + XImage* bgImage = XCreateImage(display, attr.visual, attr.depth, ZPixmap, 0, + data, srcImage.width(), srcImage.height(), srcImage.depth(), srcImage.bytesPerLine()); + + Pixmap bg = XCreatePixmap(display, DefaultScreen(display), attr.depth, srcImage.width(), srcImage.height()); + + GC gc = XCreateGC(display, bg, 0, 0); + XPutImage(display, bg, gc, bgImage, 0, 0, 0, 0, srcImage.width(), srcImage.height()); + XFreeGC(display, gc); + + // This frees the malloc'd data above too + XDestroyImage(bgImage); + + XSetWindowBackgroundPixmap(display, clientWinId(), bg); + XFreePixmap(display, bg); + } +} + + }; }; --- trunk/playground/base/plasma/applets/systray-refactor/core/fdo/x11embedcontainer.h #848033:848034 @@ -39,6 +39,9 @@ X11EmbedContainer(QWidget* parent = 0); void embedClient(WId id); + +protected: + void paintEvent(QPaintEvent* event); }; }; _______________________________________________ Plasma-devel mailing list Plasma-devel@kde.org https://mail.kde.org/mailman/listinfo/plasma-devel