diff --git a/org.kde.KWin.xml b/org.kde.KWin.xml
index f89b2c70f1..160f94e406 100644
--- a/org.kde.KWin.xml
+++ b/org.kde.KWin.xml
@@ -84,5 +84,8 @@
+
+
+
diff --git a/scripting/workspace_wrapper.cpp b/scripting/workspace_wrapper.cpp
index 53036ea361..ebcced6a17 100644
--- a/scripting/workspace_wrapper.cpp
+++ b/scripting/workspace_wrapper.cpp
@@ -180,6 +180,11 @@ QString WorkspaceWrapper::desktopName(int desktop) const
return Workspace::self()->desktopName(desktop);
}
+QString WorkspaceWrapper::supportInformation() const
+{
+ return Workspace::self()->supportInformation();
+}
+
void WorkspaceWrapper::setupClientConnections(KWin::Client *client)
{
connect(client, SIGNAL(clientMinimized(KWin::Client*,bool)), SIGNAL(clientMinimized(KWin::Client*)));
diff --git a/scripting/workspace_wrapper.h b/scripting/workspace_wrapper.h
index 911420e5f5..b1c0cbb81f 100644
--- a/scripting/workspace_wrapper.h
+++ b/scripting/workspace_wrapper.h
@@ -160,6 +160,10 @@ void setter( rettype val );
* Returns the name for the given @p desktop.
**/
Q_SCRIPTABLE QString desktopName(int desktop) const;
+ /**
+ * Provides support information about the currently running KWin instance.
+ **/
+ Q_SCRIPTABLE QString supportInformation() const;
public Q_SLOTS:
// all the available key bindings
diff --git a/workspace.cpp b/workspace.cpp
index 09e4775a57..0e4a02e99a 100644
--- a/workspace.cpp
+++ b/workspace.cpp
@@ -58,6 +58,8 @@ along with this program. If not, see .
#include "deleted.h"
#include "effects.h"
#include "overlaywindow.h"
+#include
+#include
#ifdef KWIN_BUILD_TILING
#include "tiling/tile.h"
#include "tiling/tilinglayout.h"
@@ -2148,6 +2150,132 @@ void Workspace::dumpTiles() const {
#endif
}
+QString Workspace::supportInformation() const
+{
+ QString support;
+
+ support.append(ki18nc("Introductory text shown in the support information.",
+ "KWin Support Information:\n"
+ "The following information should be used when requesting support on e.g. http://forum.kde.org.\n"
+ "It provides information about the currently running instance, which options are used,\n"
+ "what OpenGL driver and which effects are running.\n"
+ "Please post the information provided underneath this introductory text to a paste bin service\n"
+ "like http://paste.kde.org instead of pasting into support threads.\n").toString());
+ support.append("\n==========================\n\n");
+ // all following strings are intended for support. They need to be pasted to e.g forums.kde.org
+ // it is expected that the support will happen in English language or that the people providing
+ // help understand English. Because of that all texts are not translated
+ support.append("Options\n");
+ support.append("=======\n");
+ const QMetaObject *metaOptions = options->metaObject();
+ for (int i=0; ipropertyCount(); ++i) {
+ const QMetaProperty property = metaOptions->property(i);
+ if (QLatin1String(property.name()) == "objectName") {
+ continue;
+ }
+ support.append(QLatin1String(property.name()) % ": " % options->property(property.name()).toString() % '\n');
+ }
+ support.append("\nCompositing\n");
+ support.append( "===========\n");
+ if (effects) {
+ support.append("Compositing is active\n");
+ switch (effects->compositingType()) {
+ case OpenGLCompositing: {
+#ifdef KWIN_HAVE_OPENGLES
+ support.append("Compositing Type: OpenGL ES 2.0\n");
+#else
+ support.append("Compositing Type: OpenGL\n");
+#endif
+
+ GLPlatform *platform = GLPlatform::instance();
+ support.append("OpenGL vendor string: " % platform->glVendorString() % '\n');
+ support.append("OpenGL renderer string: " % platform->glRendererString() % '\n');
+ support.append("OpenGL version string: " % platform->glVersionString() % '\n');
+
+ if (platform->supports(LimitedGLSL))
+ support.append("OpenGL shading language version string: " % platform->glShadingLanguageVersionString() % '\n');
+
+ support.append("Driver: " % GLPlatform::driverToString(platform->driver()) % '\n');
+ if (!platform->isMesaDriver())
+ support.append("Driver version: " % GLPlatform::versionToString(platform->driverVersion()) % '\n');
+
+ support.append("GPU class: " % GLPlatform::chipClassToString(platform->chipClass()) % '\n');
+
+ support.append("OpenGL version: " % GLPlatform::versionToString(platform->glVersion()) % '\n');
+
+ if (platform->supports(LimitedGLSL))
+ support.append("GLSL version: " % GLPlatform::versionToString(platform->glslVersion()) % '\n');
+
+ if (platform->isMesaDriver())
+ support.append("Mesa version: " % GLPlatform::versionToString(platform->mesaVersion()) % '\n');
+ if (platform->serverVersion() > 0)
+ support.append("X server version: " % GLPlatform::versionToString(platform->serverVersion()) % '\n');
+ if (platform->kernelVersion() > 0)
+ support.append("Linux kernel version: " % GLPlatform::versionToString(platform->kernelVersion()) % '\n');
+
+ support.append("Direct rendering: ");
+ if (platform->isDirectRendering()) {
+ support.append("yes\n");
+ } else {
+ support.append("no\n");
+ }
+ support.append("Requires strict binding: ");
+ if (!platform->isLooseBinding()) {
+ support.append("yes\n");
+ } else {
+ support.append("no\n");
+ }
+ support.append("GLSL shaders: ");
+ if (platform->supports(GLSL)) {
+ if (platform->supports(LimitedGLSL)) {
+ support.append(" limited\n");
+ } else {
+ support.append(" yes\n");
+ }
+ } else {
+ support.append(" no\n");
+ }
+ support.append("Texture NPOT support: ");
+ if (platform->supports(TextureNPOT)) {
+ if (platform->supports(LimitedNPOT)) {
+ support.append(" limited\n");
+ } else {
+ support.append(" yes\n");
+ }
+ } else {
+ support.append(" no\n");
+ }
+
+ if (ShaderManager::instance()->isValid()) {
+ support.append("OpenGL 2 Shaders are used\n");
+ } else {
+ support.append("OpenGL 2 Shaders are not used. Legacy OpenGL 1.x code path is used.\n");
+ }
+ break;
+ }
+ case XRenderCompositing:
+ support.append("Compositing Type: XRender\n");
+ break;
+ case NoCompositing:
+ default:
+ support.append("Something is really broken, neither OpenGL nor XRender is used");
+ }
+ support.append("\nLoaded Effects:\n");
+ support.append( "---------------\n");
+ foreach (const QString &effect, loadedEffects()) {
+ support.append(effect % '\n');
+ }
+ support.append("\nCurrently Active Effects:\n");
+ support.append( "-------------------------\n");
+ foreach (const QString &effect, activeEffects()) {
+ support.append(effect % '\n');
+ }
+ } else {
+ support.append("Compositing is not active\n");
+ }
+ return support;
+}
+
} // namespace
#include "workspace.moc"
diff --git a/workspace.h b/workspace.h
index 3c5956936b..f8316b3163 100644
--- a/workspace.h
+++ b/workspace.h
@@ -448,6 +448,7 @@ public:
bool stopActivity(const QString &id);
bool startActivity(const QString &id);
QStringList activeEffects() const;
+ QString supportInformation() const;
void setCurrentScreen(int new_screen);