rendered paste bodyIndex: kapplication.h
===================================================================
--- kapplication.h (revision 730871)
+++ kapplication.h (working copy)
@@ -83,13 +83,15 @@
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.kde.KApplication")
public:
+ KApplication();
+
/**
* This constructor is the one you should use.
* It takes aboutData and command line arguments from KCmdLineArgs.
*
* @param GUIenabled Set to false to disable all GUI stuff.
*/
- explicit KApplication(bool GUIenabled = true);
+ explicit KApplication(bool GUIenabled);
#ifdef Q_WS_X11
/**
Index: kapplication.cpp
===================================================================
--- kapplication.cpp (revision 730871)
+++ kapplication.cpp (working copy)
@@ -91,6 +91,7 @@
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#include <X11/SM/SMlib.h>
+#include <X11/extensions/Xrender.h>
#include <fixx11h.h>
#include <QX11Info>
@@ -244,9 +245,91 @@
KConfig* pSessionConfig; //instance specific application config object
bool bSessionManagement;
+
+#ifdef Q_WS_X11
+ static Display *display();
+ static Qt::HANDLE visual();
+ static Qt::HANDLE colormap();
+#endif
};
+#ifdef Q_WS_X11
+class CustomDisplay
+{
+public:
+ static CustomDisplay *instance() { if (!s_instance) s_instance = new CustomDisplay; return s_instance; }
+ CustomDisplay();
+ ~CustomDisplay() { s_instance = 0; }
+ Display *display;
+ Qt::HANDLE visual;
+ Qt::HANDLE colormap;
+private:
+ static CustomDisplay *s_instance;
+};
+
+CustomDisplay *CustomDisplay::s_instance = 0;
+
+CustomDisplay::CustomDisplay()
+ : display(0), visual(0), colormap(0)
+{
+ if (!KWindowSystem::compositingActive()) {
+ return;
+ }
+ bool argbVisual = false;
+ Display *dpy = XOpenDisplay(0); // open default display
+ if (!dpy) {
+ qWarning("Cannot connect to the X server");
+ exit(1);
+ }
+
+ const int screen = DefaultScreen(dpy);
+ Colormap _colormap = 0;
+ Visual *_visual = 0;
+ int eventBase, errorBase;
+
+ if (XRenderQueryExtension(dpy, &eventBase, &errorBase)) {
+ int nvi;
+ XVisualInfo templ;
+ templ.screen = screen;
+ templ.depth = 32;
+ templ.c_class = TrueColor;
+ XVisualInfo *xvi = XGetVisualInfo(dpy, VisualScreenMask | VisualDepthMask | VisualClassMask,
+ &templ, &nvi);
+
+ for (int i = 0; i < nvi; ++i) {
+ XRenderPictFormat *format = XRenderFindVisualFormat(dpy, xvi[i].visual);
+ if (format->type == PictTypeDirect && format->direct.alphaMask) {
+ _visual = xvi[i].visual;
+ _colormap = XCreateColormap(dpy, RootWindow(dpy, screen), _visual, AllocNone);
+ argbVisual = true;
+ break;
+ }
+ }
+ }
+ if (argbVisual) {
+ display = dpy;
+ visual = Qt::HANDLE(_visual);
+ colormap = Qt::HANDLE(_colormap);
+ } else {
+ XCloseDisplay(dpy);
+ }
+}
+
+Display *KApplicationPrivate::display()
+{
+ return CustomDisplay::instance()->display;
+}
+Qt::HANDLE KApplicationPrivate::visual()
+{
+ return CustomDisplay::instance()->visual;
+}
+Qt::HANDLE KApplicationPrivate::colormap()
+{
+ return CustomDisplay::instance()->colormap;
+}
+#endif
+
static QList<const QWidget*> *x11Filter = 0;
/**
@@ -349,8 +432,29 @@
// Possibly "steal" XFree86's libSM?
#endif
+KApplication::KApplication()
+#ifdef Q_WS_X11
+ : QApplication((KApplicationPrivate::preqapplicationhack(), KApplicationPrivate::display()),
+ KCmdLineArgs::qtArgc(), KCmdLineArgs::qtArgv(), KApplicationPrivate::visual(),
+ KApplicationPrivate::colormap()),
+#else
+ : QApplication((KApplicationPrivate::preqapplicationhack(),KCmdLineArgs::qtArgc()), KCmdLineArgs::qtArgv()),
+#endif
+ d(new KApplicationPrivate(this))
+{
+ d->read_app_startup_id();
+ setApplicationName(d->componentData.componentName());
+ setOrganizationDomain(d->componentData.aboutData()->organizationDomain());
+ installSigpipeHandler();
+ d->init(true);
+}
+
KApplication::KApplication(bool GUIenabled)
+#ifdef Q_WS_X11
: QApplication((KApplicationPrivate::preqapplicationhack(),KCmdLineArgs::qtArgc()), KCmdLineArgs::qtArgv(), GUIenabled),
+#else
+ : QApplication((KApplicationPrivate::preqapplicationhack(),KCmdLineArgs::qtArgc()), KCmdLineArgs::qtArgv(), GUIenabled),
+#endif
d(new KApplicationPrivate(this))
{
d->read_app_startup_id();