All pastes #756661 Raw Edit

Anonymous

public text v1 · immutable
#756661 ·published 2007-10-31 17:26 UTC
rendered paste body
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 <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();