Index: 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 #include #include +#include #include #include @@ -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 *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();