diff --git a/data/org_kde_kwin.categories b/data/org_kde_kwin.categories
index 9fa463923b..6f909fc591 100644
--- a/data/org_kde_kwin.categories
+++ b/data/org_kde_kwin.categories
@@ -1,5 +1,8 @@
kwin_core KWin Core
kwineffects KWin Effects
+libkwineffects KWin Effects Library
+libkwinglutils KWin OpenGL utility Library
+libkwinxrenderutils KWin XRender utility Library
kwin_wayland_drm KWin Wayland (DRM backend)
kwin_wayland_framebuffer KWin Wayland (Framebuffer backend)
kwin_wayland_hwcomposer KWin Wayland (hwcomposer backend)
diff --git a/libkwineffects/CMakeLists.txt b/libkwineffects/CMakeLists.txt
index a9cafae7a7..0a369c6e0f 100644
--- a/libkwineffects/CMakeLists.txt
+++ b/libkwineffects/CMakeLists.txt
@@ -11,6 +11,7 @@ ecm_setup_version(${PROJECT_VERSION}
### xrenderutils lib ###
set(kwin_XRENDERUTILS_SRCS
kwinxrenderutils.cpp
+ logging.cpp
)
add_library(kwinxrenderutils SHARED ${kwin_XRENDERUTILS_SRCS})
@@ -37,6 +38,7 @@ set(kwin_EFFECTSLIB_SRCS
kwineffects.cpp
anidata.cpp
kwinanimationeffect.cpp
+ logging.cpp
)
set(kwineffects_QT_LIBS
@@ -81,6 +83,7 @@ set(kwin_GLUTILSLIB_SRCS
kwinglutils_funcs.cpp
kwinglplatform.cpp
kwinglcolorcorrection.cpp
+ logging.cpp
)
macro( KWIN4_ADD_GLUTILS_BACKEND name glinclude )
diff --git a/libkwineffects/anidata.cpp b/libkwineffects/anidata.cpp
index 2b78a7acd6..81ad9765d1 100644
--- a/libkwineffects/anidata.cpp
+++ b/libkwineffects/anidata.cpp
@@ -20,7 +20,7 @@ along with this program. If not, see .
#include "anidata_p.h"
-#include
+#include "logging_p.h"
QDebug operator<<(QDebug dbg, const KWin::AniData &a)
{
@@ -80,7 +80,7 @@ static FPx2 fpx2(const QString &s, AnimationEffect::Attribute a)
a == AnimationEffect::Size ||
a == AnimationEffect::Rotation)) ) {
if (ok)
- qDebug() << "Invalid value (must not be negative)" << s;
+ qCDebug(LIBKWINEFFECTS) << "Invalid value (must not be negative)" << s;
return FPx2();
}
@@ -96,7 +96,7 @@ static FPx2 fpx2(const QString &s, AnimationEffect::Attribute a)
f2 = f1;
}
if ( forced_align && a >= AnimationEffect::NonFloatBase )
- qDebug() << "Generic Animations, WARNING: had to align second dimension of non-onedimensional attribute" << a;
+ qCDebug(LIBKWINEFFECTS) << "Generic Animations, WARNING: had to align second dimension of non-onedimensional attribute" << a;
return FPx2(f1, f2);
}
@@ -122,7 +122,7 @@ AniData::AniData(const QString &str) // format: WindowMask:Attribute:Meta:Durati
else if (animation.at(1) == QStringLiteral("Size")) attribute = AnimationEffect::Size;
else if (animation.at(1) == QStringLiteral("Clip")) attribute = AnimationEffect::Clip;
else {
- qDebug() << "Invalid attribute" << animation.at(1);
+ qCDebug(LIBKWINEFFECTS) << "Invalid attribute" << animation.at(1);
return;
}
@@ -131,7 +131,7 @@ AniData::AniData(const QString &str) // format: WindowMask:Attribute:Meta:Durati
bool ok;
duration = animation.at(3).toInt(&ok);
if (!ok || duration < 0) {
- qDebug() << "Invalid duration" << animation.at(3);
+ qCDebug(LIBKWINEFFECTS) << "Invalid duration" << animation.at(3);
duration = 0;
return;
}
@@ -145,12 +145,12 @@ AniData::AniData(const QString &str) // format: WindowMask:Attribute:Meta:Durati
else if (customCurve == Gaussian)
curve.setCustomType(AnimationEffect::qecGaussian);
else
- qDebug() << "Unknown curve type" << customCurve; // remains default, ie. linear
+ qCDebug(LIBKWINEFFECTS) << "Unknown curve type" << customCurve; // remains default, ie. linear
if (animation.count() > 6) {
int t = animation.at(6).toInt();
if (t < 0)
- qDebug() << "Delay can not be negative" << animation.at(6);
+ qCDebug(LIBKWINEFFECTS) << "Delay can not be negative" << animation.at(6);
else
time = t;
diff --git a/libkwineffects/kwinglcolorcorrection.cpp b/libkwineffects/kwinglcolorcorrection.cpp
index 97382746c8..7305f0e3e7 100644
--- a/libkwineffects/kwinglcolorcorrection.cpp
+++ b/libkwineffects/kwinglcolorcorrection.cpp
@@ -23,13 +23,13 @@ along with this program. If not, see .
#include "kwinglplatform.h"
#include "kwinglutils.h"
+#include "logging_p.h"
#include
#include
#include
#include
#include
-#include
#include
#include
@@ -101,7 +101,7 @@ ColorServerInterface::~ColorServerInterface()
uint ColorServerInterface::versionInfo() const
{
if (!m_versionInfoUpdated)
- qWarning() << "Version info not updated";
+ qCWarning(LIBKWINGLUTILS) << "Version info not updated";
return m_versionInfo;
}
@@ -154,10 +154,10 @@ QDBusPendingReply< RegionalClutMap > ColorServerInterface::getRegionCluts()
void ColorServerInterface::callFinishedSlot(QDBusPendingCallWatcher *watcher)
{
if (watcher == m_versionInfoWatcher) {
- qDebug() << "Version info call finished";
+ qCDebug(LIBKWINGLUTILS) << "Version info call finished";
QDBusPendingReply< uint > reply = *watcher;
if (reply.isError()) {
- qWarning() << reply.error();
+ qCWarning(LIBKWINGLUTILS) << reply.error();
if (!m_signaledFail)
emit updateFailed();
m_signaledFail = true;
@@ -169,10 +169,10 @@ void ColorServerInterface::callFinishedSlot(QDBusPendingCallWatcher *watcher)
}
if (watcher == m_outputClutsWatcher) {
- qDebug() << "Output cluts call finished";
+ qCDebug(LIBKWINGLUTILS) << "Output cluts call finished";
QDBusPendingReply< ClutList > reply = *watcher;
if (reply.isError()) {
- qWarning() << reply.error();
+ qCWarning(LIBKWINGLUTILS) << reply.error();
if (!m_signaledFail)
emit updateFailed();
m_signaledFail = true;
@@ -184,10 +184,10 @@ void ColorServerInterface::callFinishedSlot(QDBusPendingCallWatcher *watcher)
}
if (watcher == m_regionClutsWatcher) {
- qDebug() << "Region cluts call finished";
+ qCDebug(LIBKWINGLUTILS) << "Region cluts call finished";
QDBusPendingReply< RegionalClutMap > reply = *watcher;
if (reply.isError()) {
- qWarning() << reply.error();
+ qCWarning(LIBKWINGLUTILS) << reply.error();
if (!m_signaledFail)
emit updateFailed();
m_signaledFail = true;
@@ -201,7 +201,7 @@ void ColorServerInterface::callFinishedSlot(QDBusPendingCallWatcher *watcher)
if (m_versionInfoUpdated &&
m_outputClutsUpdated &&
m_regionClutsUpdated) {
- qDebug() << "Update succeeded";
+ qCDebug(LIBKWINGLUTILS) << "Update succeeded";
emit updateSucceeded();
}
}
@@ -284,14 +284,14 @@ bool ColorCorrection::setEnabled(bool enabled)
return true;
if (enabled && d->m_hasError) {
- qCritical() << "cannot enable color correction because of a previous error";
+ qCCritical(LIBKWINGLUTILS) << "cannot enable color correction because of a previous error";
return false;
}
#ifdef KWIN_HAVE_OPENGLES
const GLPlatform *gl = GLPlatform::instance();
if (enabled && gl->isGLES() && !d->m_haveTexture3D) {
- qCritical() << "color correction is not supported on OpenGL ES without OES_texture_3D";
+ qCCritical(LIBKWINGLUTILS) << "color correction is not supported on OpenGL ES without OES_texture_3D";
d->m_hasError = true;
return false;
}
@@ -300,14 +300,14 @@ bool ColorCorrection::setEnabled(bool enabled)
if (enabled) {
// Update all profiles and regions
d->m_csi->update();
- qDebug() << "color correction will be enabled after contacting KolorManager";
+ qCDebug(LIBKWINGLUTILS) << "color correction will be enabled after contacting KolorManager";
d->m_duringEnablingPhase = true;
// d->m_enabled will be set to true in colorServerUpdateSucceededSlot()
} else {
d->deleteCCTextures();
d->m_enabled = false;
GLShader::sColorCorrect = false;
- qDebug() << "color correction has been disabled";
+ qCDebug(LIBKWINGLUTILS) << "color correction has been disabled";
// Reload all shaders
ShaderManager::cleanup();
@@ -326,7 +326,7 @@ void ColorCorrection::setupForOutput(int screen)
GLShader *shader = ShaderManager::instance()->getBoundShader();
if (!shader) {
- qCritical() << "no bound shader for color correction setup";
+ qCCritical(LIBKWINGLUTILS) << "no bound shader for color correction setup";
d->m_hasError = true;
emit errorOccured();
return;
@@ -339,14 +339,14 @@ void ColorCorrection::setupForOutput(int screen)
}
if (!shader->setUniform(GLShader::ColorCorrectionLookupTextureUnit, d->m_ccTextureUnit)) {
- qCritical() << "unable to set uniform for the color correction lookup texture";
+ qCCritical(LIBKWINGLUTILS) << "unable to set uniform for the color correction lookup texture";
d->m_hasError = true;
emit errorOccured();
return;
}
if (!d->setupCCTextures()) {
- qCritical() << "unable to setup color correction textures";
+ qCCritical(LIBKWINGLUTILS) << "unable to setup color correction textures";
d->m_hasError = true;
emit errorOccured();
return;
@@ -556,7 +556,7 @@ QByteArray ColorCorrection::prepareFragmentShader(const QByteArray &sourceCode)
bool ColorCorrectionPrivate::setupCCTextures()
{
if (!m_enabled || m_hasError) {
- qWarning() << "Color correction not enabled or an error occurred, refusing to set up textures";
+ qCWarning(LIBKWINGLUTILS) << "Color correction not enabled or an error occurred, refusing to set up textures";
return false;
}
@@ -564,7 +564,7 @@ bool ColorCorrectionPrivate::setupCCTextures()
if (!m_dummyCCTexture) {
glGenTextures(1, &m_dummyCCTexture);
if (!setupCCTexture(m_dummyCCTexture, m_dummyClut)) {
- qCritical() << "unable to setup dummy color correction texture";
+ qCCritical(LIBKWINGLUTILS) << "unable to setup dummy color correction texture";
m_dummyCCTexture = 0;
return false;
}
@@ -574,7 +574,7 @@ bool ColorCorrectionPrivate::setupCCTextures()
// Setup actual color correction textures
if (m_outputCCTextures.isEmpty() && !m_outputCluts->isEmpty()) {
- qDebug() << "setting up output color correction textures";
+ qCDebug(LIBKWINGLUTILS) << "setting up output color correction textures";
const int outputCount = m_outputCluts->size();
m_outputCCTextures.resize(outputCount);
@@ -582,7 +582,7 @@ bool ColorCorrectionPrivate::setupCCTextures()
for (int i = 0; i < outputCount; ++i)
if (!setupCCTexture(m_outputCCTextures[i], m_outputCluts->at(i))) {
- qCritical() << "unable to set up color correction texture for output" << i;
+ qCCritical(LIBKWINGLUTILS) << "unable to set up color correction texture for output" << i;
success = false;
}
}
@@ -608,7 +608,7 @@ void ColorCorrectionPrivate::deleteCCTextures()
bool ColorCorrectionPrivate::setupCCTexture(GLuint texture, const Clut& clut)
{
if ((uint) clut.size() != CLUT_ELEMENT_COUNT) {
- qCritical() << "cannot setup CC texture: invalid color lookup table";
+ qCCritical(LIBKWINGLUTILS) << "cannot setup CC texture: invalid color lookup table";
return false;
}
@@ -647,7 +647,7 @@ void ColorCorrectionPrivate::colorServerUpdateSucceededSlot()
{
Q_Q(ColorCorrection);
- qDebug() << "Update of color profiles succeeded";
+ qCDebug(LIBKWINGLUTILS) << "Update of color profiles succeeded";
// Force the color correction textures to be recreated
deleteCCTextures();
@@ -657,15 +657,15 @@ void ColorCorrectionPrivate::colorServerUpdateSucceededSlot()
m_duringEnablingPhase = false;
m_enabled = true;
GLShader::sColorCorrect = true;
- qDebug() << "Color correction has been enabled";
+ qCDebug(LIBKWINGLUTILS) << "Color correction has been enabled";
// Reload all shaders
ShaderManager::cleanup();
if (!ShaderManager::instance()->isValid()) {
- qCritical() << "Shader reinitialization failed, possible compile problems with the shaders "
+ qCCritical(LIBKWINGLUTILS) << "Shader reinitialization failed, possible compile problems with the shaders "
"altered for color-correction";
m_hasError = true;
- qDebug() << "Color correction has been disabled due to shader issues";
+ qCDebug(LIBKWINGLUTILS) << "Color correction has been disabled due to shader issues";
m_enabled = false;
GLShader::sColorCorrect = false;
ShaderManager::cleanup();
@@ -682,7 +682,7 @@ void ColorCorrectionPrivate::colorServerUpdateFailedSlot()
m_duringEnablingPhase = false;
- qCritical() << "Update of color profiles failed";
+ qCCritical(LIBKWINGLUTILS) << "Update of color profiles failed";
m_hasError = true;
emit q->errorOccured();
}
diff --git a/libkwineffects/kwinglutils.cpp b/libkwineffects/kwinglutils.cpp
index 0ad4739bf3..66634d6795 100644
--- a/libkwineffects/kwinglutils.cpp
+++ b/libkwineffects/kwinglutils.cpp
@@ -27,9 +27,9 @@ along with this program. If not, see .
#include "kwinglcolorcorrection.h"
#include "kwineffects.h"
#include "kwinglplatform.h"
+#include "logging_p.h"
-#include
#include
#include
#include
@@ -193,7 +193,7 @@ bool checkGLError(const char* txt)
GLenum err = glGetError();
bool hasError = false;
while (err != GL_NO_ERROR) {
- qWarning() << "GL error (" << txt << "): " << formatGLError(err);
+ qCWarning(LIBKWINGLUTILS) << "GL error (" << txt << "): " << formatGLError(err);
hasError = true;
err = glGetError();
}
@@ -249,14 +249,14 @@ bool GLShader::loadFromFiles(const QString &vertexFile, const QString &fragmentF
{
QFile vf(vertexFile);
if (!vf.open(QIODevice::ReadOnly)) {
- qCritical() << "Couldn't open" << vertexFile << "for reading!";
+ qCCritical(LIBKWINGLUTILS) << "Couldn't open" << vertexFile << "for reading!";
return false;
}
const QByteArray vertexSource = vf.readAll();
QFile ff(fragmentFile);
if (!ff.open(QIODevice::ReadOnly)) {
- qCritical() << "Couldn't open" << fragmentFile << "for reading!";
+ qCCritical(LIBKWINGLUTILS) << "Couldn't open" << fragmentFile << "for reading!";
return false;
}
const QByteArray fragmentSource = ff.readAll();
@@ -283,10 +283,10 @@ bool GLShader::link()
glGetProgramiv(mProgram, GL_LINK_STATUS, &status);
if (status == 0) {
- qCritical() << "Failed to link shader:" << endl << log;
+ qCCritical(LIBKWINGLUTILS) << "Failed to link shader:" << endl << log;
mValid = false;
} else if (length > 0) {
- qDebug() << "Shader link log:" << log;
+ qCDebug(LIBKWINGLUTILS) << "Shader link log:" << log;
}
return mValid;
@@ -342,9 +342,9 @@ bool GLShader::compile(GLuint program, GLenum shaderType, const QByteArray &sour
if (status == 0) {
const char *typeName = (shaderType == GL_VERTEX_SHADER ? "vertex" : "fragment");
- qCritical() << "Failed to compile" << typeName << "shader:" << endl << log;
+ qCCritical(LIBKWINGLUTILS) << "Failed to compile" << typeName << "shader:" << endl << log;
} else if (length > 0)
- qDebug() << "Shader compile log:" << log;
+ qCDebug(LIBKWINGLUTILS) << "Shader compile log:" << log;
if (status != 0)
glAttachShader(program, shader);
@@ -358,7 +358,7 @@ bool GLShader::load(const QByteArray &vertexSource, const QByteArray &fragmentSo
#ifndef KWIN_HAVE_OPENGLES
// Make sure shaders are actually supported
if (!GLPlatform::instance()->supports(GLSL) || GLPlatform::instance()->supports(LimitedNPOT)) {
- qCritical() << "Shaders are not supported";
+ qCCritical(LIBKWINGLUTILS) << "Shaders are not supported";
return false;
}
#endif
@@ -706,7 +706,7 @@ bool ShaderManager::selfTest()
bool pass = true;
if (!GLRenderTarget::supported()) {
- qWarning() << "Framebuffer objects not supported - skipping shader tests";
+ qCWarning(LIBKWINGLUTILS) << "Framebuffer objects not supported - skipping shader tests";
return true;
}
@@ -992,11 +992,11 @@ GLShader *ShaderManager::generateShader(ShaderTraits traits)
const QByteArray fragment = generateFragmentSource(traits);
#if 0
- qDebug() << "**************";
- qDebug() << vertex;
- qDebug() << "**************";
- qDebug() << fragment;
- qDebug() << "**************";
+ qCDebug(LIBKWINGLUTILS) << "**************";
+ qCDebug(LIBKWINGLUTILS) << vertex;
+ qCDebug(LIBKWINGLUTILS) << "**************";
+ qCDebug(LIBKWINGLUTILS) << fragment;
+ qCDebug(LIBKWINGLUTILS) << "**************";
#endif
GLShader *shader = new GLShader(GLShader::ExplicitLinking);
@@ -1356,7 +1356,7 @@ GLRenderTarget::GLRenderTarget(const GLTexture& color)
if (sSupported && !mTexture.isNull()) {
initFBO();
} else
- qCritical() << "Render targets aren't supported!";
+ qCCritical(LIBKWINGLUTILS) << "Render targets aren't supported!";
}
GLRenderTarget::~GLRenderTarget()
@@ -1369,7 +1369,7 @@ GLRenderTarget::~GLRenderTarget()
bool GLRenderTarget::enable()
{
if (!valid()) {
- qCritical() << "Can't enable invalid render target!";
+ qCCritical(LIBKWINGLUTILS) << "Can't enable invalid render target!";
return false;
}
@@ -1383,7 +1383,7 @@ bool GLRenderTarget::enable()
bool GLRenderTarget::disable()
{
if (!valid()) {
- qCritical() << "Can't disable invalid render target!";
+ qCCritical(LIBKWINGLUTILS) << "Can't disable invalid render target!";
return false;
}
@@ -1432,14 +1432,14 @@ void GLRenderTarget::initFBO()
#if DEBUG_GLRENDERTARGET
GLenum err = glGetError();
if (err != GL_NO_ERROR)
- qCritical() << "Error status when entering GLRenderTarget::initFBO: " << formatGLError(err);
+ qCCritical(LIBKWINGLUTILS) << "Error status when entering GLRenderTarget::initFBO: " << formatGLError(err);
#endif
glGenFramebuffers(1, &mFramebuffer);
#if DEBUG_GLRENDERTARGET
if ((err = glGetError()) != GL_NO_ERROR) {
- qCritical() << "glGenFramebuffers failed: " << formatGLError(err);
+ qCCritical(LIBKWINGLUTILS) << "glGenFramebuffers failed: " << formatGLError(err);
return;
}
#endif
@@ -1448,7 +1448,7 @@ void GLRenderTarget::initFBO()
#if DEBUG_GLRENDERTARGET
if ((err = glGetError()) != GL_NO_ERROR) {
- qCritical() << "glBindFramebuffer failed: " << formatGLError(err);
+ qCCritical(LIBKWINGLUTILS) << "glBindFramebuffer failed: " << formatGLError(err);
glDeleteFramebuffers(1, &mFramebuffer);
return;
}
@@ -1459,7 +1459,7 @@ void GLRenderTarget::initFBO()
#if DEBUG_GLRENDERTARGET
if ((err = glGetError()) != GL_NO_ERROR) {
- qCritical() << "glFramebufferTexture2D failed: " << formatGLError(err);
+ qCCritical(LIBKWINGLUTILS) << "glFramebufferTexture2D failed: " << formatGLError(err);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDeleteFramebuffers(1, &mFramebuffer);
return;
@@ -1473,9 +1473,9 @@ void GLRenderTarget::initFBO()
if (status != GL_FRAMEBUFFER_COMPLETE) {
// We have an incomplete framebuffer, consider it invalid
if (status == 0)
- qCritical() << "glCheckFramebufferStatus failed: " << formatGLError(glGetError());
+ qCCritical(LIBKWINGLUTILS) << "glCheckFramebufferStatus failed: " << formatGLError(glGetError());
else
- qCritical() << "Invalid framebuffer status: " << formatFramebufferStatus(status);
+ qCCritical(LIBKWINGLUTILS) << "Invalid framebuffer status: " << formatFramebufferStatus(status);
glDeleteFramebuffers(1, &mFramebuffer);
return;
}
@@ -2120,11 +2120,11 @@ bool GLVertexBufferPrivate::awaitFence(intptr_t end)
const BufferFence &fence = fences.front();
if (!fence.signaled()) {
- qDebug() << "Stalling on VBO fence";
+ qCDebug(LIBKWINGLUTILS) << "Stalling on VBO fence";
const GLenum ret = glClientWaitSync(fence.sync, GL_SYNC_FLUSH_COMMANDS_BIT, 1000000000);
if (ret == GL_TIMEOUT_EXPIRED || ret == GL_WAIT_FAILED) {
- qCritical() << "Wait failed";
+ qCCritical(LIBKWINGLUTILS) << "Wait failed";
return false;
}
}
diff --git a/libkwineffects/kwinxrenderutils.cpp b/libkwineffects/kwinxrenderutils.cpp
index 7d96606135..da8c249905 100644
--- a/libkwineffects/kwinxrenderutils.cpp
+++ b/libkwineffects/kwinxrenderutils.cpp
@@ -19,8 +19,8 @@ along with this program. If not, see .
*********************************************************************/
#include "kwinxrenderutils.h"
+#include "logging_p.h"
-#include
#include
#include
#include
@@ -113,7 +113,7 @@ static xcb_render_picture_t createPicture(xcb_pixmap_t pix, int depth)
}
QHash::const_iterator it = s_renderFormats.constFind(depth);
if (it == s_renderFormats.constEnd()) {
- qWarning() << "Could not find XRender format for depth" << depth;
+ qCWarning(LIBKWINXRENDERUTILS) << "Could not find XRender format for depth" << depth;
return XCB_RENDER_PICTURE_NONE;
}
xcb_render_picture_t pic = xcb_generate_id(c);
@@ -197,7 +197,7 @@ void setXRenderOffscreen(bool b)
b ? ++s_renderOffscreen : --s_renderOffscreen;
if (s_renderOffscreen < 0) {
s_renderOffscreen = 0;
- qWarning("*** SOMETHING IS MESSED UP WITH YOUR setXRenderOffscreen() USAGE ***");
+ qCWarning(LIBKWINXRENDERUTILS) << "*** SOMETHING IS MESSED UP WITH YOUR setXRenderOffscreen() USAGE ***";
}
}
@@ -213,7 +213,7 @@ void xRenderPopTarget()
--s_renderOffscreen;
if (s_renderOffscreen < 0) {
s_renderOffscreen = 0;
- qWarning("*** SOMETHING IS MESSED UP WITH YOUR xRenderPopTarget() USAGE ***");
+ qCWarning(LIBKWINXRENDERUTILS) << "*** SOMETHING IS MESSED UP WITH YOUR xRenderPopTarget() USAGE ***";
}
}
diff --git a/libkwineffects/logging.cpp b/libkwineffects/logging.cpp
new file mode 100644
index 0000000000..b0c9a0167b
--- /dev/null
+++ b/libkwineffects/logging.cpp
@@ -0,0 +1,23 @@
+/********************************************************************
+ KWin - the KDE window manager
+ This file is part of the KDE project.
+
+Copyright (C) 2015 Martin Gräßlin
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
+*********************************************************************/
+#include "logging_p.h"
+Q_LOGGING_CATEGORY(LIBKWINEFFECTS, "libkwineffects", QtCriticalMsg);
+Q_LOGGING_CATEGORY(LIBKWINGLUTILS, "libkwinglutils", QtCriticalMsg);
+Q_LOGGING_CATEGORY(LIBKWINXRENDERUTILS, "libkwinxrenderutils", QtCriticalMsg);
diff --git a/libkwineffects/logging_p.h b/libkwineffects/logging_p.h
new file mode 100644
index 0000000000..aed723be11
--- /dev/null
+++ b/libkwineffects/logging_p.h
@@ -0,0 +1,30 @@
+/********************************************************************
+ KWin - the KDE window manager
+ This file is part of the KDE project.
+
+Copyright (C) 2015 Martin Gräßlin
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
+*********************************************************************/
+#ifndef KWIN_KWINEFFECTS_LOGGING_P_H
+#define KWIN_KWINEFFECTS_LOGGING_P_H
+
+#include
+#include
+
+Q_DECLARE_LOGGING_CATEGORY(LIBKWINEFFECTS);
+Q_DECLARE_LOGGING_CATEGORY(LIBKWINGLUTILS);
+Q_DECLARE_LOGGING_CATEGORY(LIBKWINXRENDERUTILS);
+
+#endif