diff --git a/composite.cpp b/composite.cpp
index cf085a76bf..ccf7ad4de7 100644
--- a/composite.cpp
+++ b/composite.cpp
@@ -88,6 +88,7 @@ Compositor::Compositor(QObject* workspace)
, compositingSuspended(!options->isUseCompositing())
, compositingBlocked(false)
, m_xrrRefreshRate(0)
+ , m_scene(NULL)
{
connect(&unredirectTimer, SIGNAL(timeout()), SLOT(delayedCheckUnredirect()));
connect(&compositeResetTimer, SIGNAL(timeout()), SLOT(resetCompositing()));
@@ -112,7 +113,7 @@ Compositor::~Compositor()
void Compositor::setupCompositing()
{
- if (scene != NULL)
+ if (hasScene())
return;
if (compositingSuspended) {
kDebug(1212) << "Compositing is suspended";
@@ -170,16 +171,16 @@ void Compositor::slotCompositingOptionsInitialized()
}
#endif
- scene = new SceneOpenGL(Workspace::self());
+ m_scene = new SceneOpenGL(Workspace::self());
// TODO: Add 30 second delay to protect against screen freezes as well
unsafeConfig.writeEntry("OpenGLIsUnsafe", false);
unsafeConfig.sync();
- if (!scene->initFailed())
+ if (!m_scene->initFailed())
break; // -->
- delete scene;
- scene = NULL;
+ delete m_scene;
+ m_scene = NULL;
}
// Do not Fall back to XRender - it causes problems when selfcheck fails during startup, but works later on
@@ -188,7 +189,7 @@ void Compositor::slotCompositingOptionsInitialized()
#ifdef KWIN_HAVE_XRENDER_COMPOSITING
case XRenderCompositing:
kDebug(1212) << "Initializing XRender compositing";
- scene = new SceneXrender(Workspace::self());
+ m_scene = new SceneXrender(Workspace::self());
break;
#endif
default:
@@ -196,17 +197,17 @@ void Compositor::slotCompositingOptionsInitialized()
delete cm_selection;
return;
}
- if (scene == NULL || scene->initFailed()) {
+ if (m_scene == NULL || m_scene->initFailed()) {
kError(1212) << "Failed to initialize compositing, compositing disabled";
kError(1212) << "Consult http://techbase.kde.org/Projects/KWin/4.0-release-notes#Setting_up";
- delete scene;
- scene = NULL;
+ delete m_scene;
+ m_scene = NULL;
delete cm_selection;
return;
}
m_xrrRefreshRate = KWin::currentRefreshRate();
fpsInterval = (options->maxFpsInterval() << 10);
- if (scene->waitSyncAvailable()) { // if we do vsync, set the fps to the next multiple of the vblank rate
+ if (m_scene->waitSyncAvailable()) { // if we do vsync, set the fps to the next multiple of the vblank rate
vBlankInterval = (1000 << 10) / m_xrrRefreshRate;
fpsInterval = qMax((fpsInterval / vBlankInterval) * vBlankInterval, vBlankInterval);
} else
@@ -214,7 +215,7 @@ void Compositor::slotCompositingOptionsInitialized()
m_timeSinceLastVBlank = fpsInterval - 1; // means "start now" - we don't have even a slight idea when the first vsync will occur
checkCompositeTimer();
XCompositeRedirectSubwindows(display(), rootWindow(), CompositeRedirectManual);
- new EffectsHandlerImpl(scene->compositingType()); // sets also the 'effects' pointer
+ new EffectsHandlerImpl(m_scene); // sets also the 'effects' pointer
addRepaintFull();
foreach (Client * c, Workspace::self()->clientList())
c->setupCompositing();
@@ -236,18 +237,18 @@ void Compositor::checkCompositeTimer()
void Compositor::finishCompositing()
{
- if (scene == NULL)
+ if (!hasScene())
return;
m_finishingCompositing = true;
delete cm_selection;
foreach (Client * c, Workspace::self()->clientList())
- scene->windowClosed(c, NULL);
+ m_scene->windowClosed(c, NULL);
foreach (Client * c, Workspace::self()->desktopList())
- scene->windowClosed(c, NULL);
+ m_scene->windowClosed(c, NULL);
foreach (Unmanaged * c, Workspace::self()->unmanagedList())
- scene->windowClosed(c, NULL);
+ m_scene->windowClosed(c, NULL);
foreach (Deleted * c, Workspace::self()->deletedList())
- scene->windowDeleted(c);
+ m_scene->windowDeleted(c);
foreach (Client * c, Workspace::self()->clientList())
c->finishCompositing();
foreach (Client * c, Workspace::self()->desktopList())
@@ -259,8 +260,8 @@ void Compositor::finishCompositing()
XCompositeUnredirectSubwindows(display(), rootWindow(), CompositeRedirectManual);
delete effects;
effects = NULL;
- delete scene;
- scene = NULL;
+ delete m_scene;
+ m_scene = NULL;
compositeTimer.stop();
mousePollingTimer.stop();
repaints_region = QRegion();
@@ -396,7 +397,7 @@ void Compositor::suspendCompositing(bool suspend)
void Compositor::resetCompositing()
{
- if (compositing()) {
+ if (hasScene()) {
finishCompositing();
QTimer::singleShot(0, this, SLOT(setupCompositing()));
}
@@ -404,7 +405,7 @@ void Compositor::resetCompositing()
void Compositor::addRepaint(int x, int y, int w, int h)
{
- if (!compositing())
+ if (!hasScene())
return;
repaints_region += QRegion(x, y, w, h);
checkCompositeTimer();
@@ -412,7 +413,7 @@ void Compositor::addRepaint(int x, int y, int w, int h)
void Compositor::addRepaint(const QRect& r)
{
- if (!compositing())
+ if (!hasScene())
return;
repaints_region += r;
checkCompositeTimer();
@@ -420,7 +421,7 @@ void Compositor::addRepaint(const QRect& r)
void Compositor::addRepaint(const QRegion& r)
{
- if (!compositing())
+ if (!hasScene())
return;
repaints_region += r;
checkCompositeTimer();
@@ -428,7 +429,7 @@ void Compositor::addRepaint(const QRegion& r)
void Compositor::addRepaintFull()
{
- if (!compositing())
+ if (!hasScene())
return;
repaints_region = QRegion(0, 0, displayWidth(), displayHeight());
checkCompositeTimer();
@@ -446,12 +447,12 @@ void Compositor::timerEvent(QTimerEvent *te)
static bool s_pending = false;
void Compositor::performCompositing()
{
- if (!scene->overlayWindow()->isVisible())
+ if (!isOverlayWindowVisible())
return; // nothing is visible anyway
bool pending = !repaints_region.isEmpty() || windowRepaintsPending();
if (!(pending || s_pending)) {
- scene->idle();
+ m_scene->idle();
// Note: It would seem here we should undo suspended unredirect, but when scenes need
// it for some reason, e.g. transformations or translucency, the next pass that does not
// need this anymore and paints normally will also reset the suspended unredirect.
@@ -479,7 +480,7 @@ void Compositor::performCompositing()
// clear all repaints, so that post-pass can add repaints for the next repaint
repaints_region = QRegion();
- m_timeSinceLastVBlank = scene->paint(repaints, windows);
+ m_timeSinceLastVBlank = m_scene->paint(repaints, windows);
// Trigger at least one more pass even if there would be nothing to paint, so that scene->idle()
// is called the next time. If there would be nothing pending, it will not restart the timer and
// checkCompositeTime() would restart it again somewhen later, called from functions that
@@ -516,12 +517,12 @@ void Compositor::setCompositeResetTimer(int msecs)
void Compositor::setCompositeTimer()
{
- if (!compositing()) // should not really happen, but there may be e.g. some damage events still pending
+ if (!hasScene()) // should not really happen, but there may be e.g. some damage events still pending
return;
uint padding = m_timeSinceLastVBlank << 10;
- if (scene->waitSyncAvailable()) {
+ if (m_scene->waitSyncAvailable()) {
// TODO: make vBlankTime dynamic?!
// It's required because glXWaitVideoSync will *likely* block a full frame if one enters
@@ -565,13 +566,13 @@ void Compositor::stopMousePolling()
bool Compositor::compositingActive()
{
- return !m_finishingCompositing && compositing();
+ return !m_finishingCompositing && hasScene();
}
// force is needed when the list of windows changes (e.g. a window goes away)
void Compositor::checkUnredirect(bool force)
{
- if (!compositing() || scene->overlayWindow()->window() == None || !options->isUnredirectFullscreen())
+ if (!hasScene() || m_scene->overlayWindow()->window() == None || !options->isUnredirectFullscreen())
return;
if (force)
forceUnredirectCheck = true;
@@ -581,7 +582,7 @@ void Compositor::checkUnredirect(bool force)
void Compositor::delayedCheckUnredirect()
{
- if (!compositing() || scene->overlayWindow()->window() == None || !options->isUnredirectFullscreen())
+ if (!hasScene() || m_scene->overlayWindow()->window() == None || !options->isUnredirectFullscreen())
return;
ToplevelList list;
bool changed = forceUnredirectCheck;
@@ -604,7 +605,50 @@ void Compositor::delayedCheckUnredirect()
if (c->unredirected())
reg -= c->geometry();
}
- scene->overlayWindow()->setShape(reg);
+ m_scene->overlayWindow()->setShape(reg);
+}
+
+bool Compositor::checkForOverlayWindow(WId w) const
+{
+ if (!hasScene()) {
+ // no scene, so it cannot be the overlay window
+ return false;
+ }
+ if (!m_scene->overlayWindow()) {
+ // no overlay window, it cannot be the overlay
+ return false;
+ }
+ // and compare the window ID's
+ return w == m_scene->overlayWindow()->window();
+}
+
+WId Compositor::overlayWindow() const
+{
+ if (!hasScene()) {
+ return None;
+ }
+ if (!m_scene->overlayWindow()) {
+ return None;
+ }
+ return m_scene->overlayWindow()->window();
+}
+
+bool Compositor::isOverlayWindowVisible() const
+{
+ if (!hasScene()) {
+ return false;
+ }
+ if (!m_scene->overlayWindow()) {
+ return false;
+ }
+ return m_scene->overlayWindow()->isVisible();
+}
+
+void Compositor::setOverlayWindowVisibility(bool visible)
+{
+ if (hasScene() && m_scene->overlayWindow()) {
+ m_scene->overlayWindow()->setVisibility(visible);
+ }
}
/*****************************************************
@@ -647,6 +691,11 @@ QString Workspace::compositingType()
return "none";
}
+bool Workspace::compositing() const
+{
+ return m_compositor && m_compositor->hasScene();
+}
+
//****************************************
// Toplevel
//****************************************
@@ -663,7 +712,7 @@ bool Toplevel::setupCompositing()
effect_window = new EffectWindowImpl(this);
unredirect = false;
workspace()->compositor()->checkUnredirect(true);
- scene->windowAdded(this);
+ workspace()->compositor()->scene()->windowAdded(this);
return true;
}
@@ -784,6 +833,12 @@ void Toplevel::damageNotifyEvent(XDamageNotifyEvent* e)
}
}
+bool Toplevel::compositing() const
+{
+ Compositor *c = workspace()->compositor();
+ return c && c->hasScene();
+}
+
void Client::damageNotifyEvent(XDamageNotifyEvent* e)
{
#ifdef HAVE_XSYNC
diff --git a/composite.h b/composite.h
index ba60f453cd..31b22425a8 100644
--- a/composite.h
+++ b/composite.h
@@ -28,6 +28,7 @@ along with this program. If not, see .
namespace KWin {
+class Scene;
class Compositor : public QObject {
Q_OBJECT
@@ -57,6 +58,30 @@ public:
int nextFrameDelay() {
return m_nextFrameDelay;
}
+ bool hasScene() const {
+ return m_scene != NULL;
+ }
+
+ /**
+ * Checks whether @p w is the Scene's overlay window.
+ **/
+ bool checkForOverlayWindow(WId w) const;
+ /**
+ * @returns The Scene's Overlay X Window.
+ **/
+ WId overlayWindow() const;
+ /**
+ * @returns Whether the Scene's Overlay X Window is visible.
+ **/
+ bool isOverlayWindowVisible() const;
+ /**
+ * Set's the Scene's Overlay X Window visibility to @p visible.
+ **/
+ void setOverlayWindowVisibility(bool visible);
+
+ Scene *scene() {
+ return m_scene;
+ }
public Q_SLOTS:
void addRepaintFull();
@@ -105,6 +130,7 @@ private:
QTimer compositeResetTimer; // for compressing composite resets
bool m_finishingCompositing; // finishCompositing() sets this variable while shutting down
int m_timeSinceLastVBlank, m_nextFrameDelay;
+ Scene *m_scene;
};
}
diff --git a/effects.cpp b/effects.cpp
index 22290d18c6..5bd15201ce 100644
--- a/effects.cpp
+++ b/effects.cpp
@@ -96,12 +96,13 @@ static void deleteWindowProperty(Window win, long int atom)
//---------------------
-EffectsHandlerImpl::EffectsHandlerImpl(CompositingType type)
- : EffectsHandler(type)
+EffectsHandlerImpl::EffectsHandlerImpl(Scene *scene)
+ : EffectsHandler(scene->compositingType())
, keyboard_grab_effect(NULL)
, fullscreen_effect(0)
, next_window_quad_type(EFFECT_QUAD_TYPE_START)
, mouse_poll_ref_count(0)
+ , m_scene(scene)
{
// init is important, otherwise causes crashes when quads are build before the first painting pass start
m_currentBuildQuadsIterator = m_activeEffects.end();
@@ -242,7 +243,7 @@ void EffectsHandlerImpl::paintScreen(int mask, QRegion region, ScreenPaintData&
(*m_currentPaintScreenIterator++)->paintScreen(mask, region, data);
--m_currentPaintScreenIterator;
} else
- scene->finalPaintScreen(mask, region, data);
+ m_scene->finalPaintScreen(mask, region, data);
}
void EffectsHandlerImpl::postPaintScreen()
@@ -269,7 +270,7 @@ void EffectsHandlerImpl::paintWindow(EffectWindow* w, int mask, QRegion region,
(*m_currentPaintWindowIterator++)->paintWindow(w, mask, region, data);
--m_currentPaintWindowIterator;
} else
- scene->finalPaintWindow(static_cast(w), mask, region, data);
+ m_scene->finalPaintWindow(static_cast(w), mask, region, data);
}
void EffectsHandlerImpl::paintEffectFrame(EffectFrame* frame, QRegion region, double opacity, double frameOpacity)
@@ -306,7 +307,7 @@ void EffectsHandlerImpl::drawWindow(EffectWindow* w, int mask, QRegion region, W
(*m_currentDrawWindowIterator++)->drawWindow(w, mask, region, data);
--m_currentDrawWindowIterator;
} else
- scene->finalDrawWindow(static_cast(w), mask, region, data);
+ m_scene->finalDrawWindow(static_cast(w), mask, region, data);
}
void EffectsHandlerImpl::buildQuads(EffectWindow* w, WindowQuadList& quadList)
@@ -585,7 +586,7 @@ bool EffectsHandlerImpl::hasKeyboardGrab() const
void EffectsHandlerImpl::desktopResized(const QSize &size)
{
- scene->screenGeometryChanged(size);
+ m_scene->screenGeometryChanged(size);
emit screenGeometryChanged(size);
Workspace::self()->compositor()->addRepaintFull();
}
@@ -1136,7 +1137,7 @@ void EffectsHandlerImpl::reserveElectricBorderSwitching(bool reserve, Qt::Orient
unsigned long EffectsHandlerImpl::xrenderBufferPicture()
{
#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (SceneXrender* s = dynamic_cast< SceneXrender* >(scene))
+ if (SceneXrender* s = dynamic_cast< SceneXrender* >(m_scene))
return s->bufferPicture();
#endif
return None;
diff --git a/effects.h b/effects.h
index 014c4cf497..b6434b3ab9 100644
--- a/effects.h
+++ b/effects.h
@@ -47,7 +47,7 @@ class EffectsHandlerImpl : public EffectsHandler
{
Q_OBJECT
public:
- EffectsHandlerImpl(CompositingType type);
+ EffectsHandlerImpl(Scene *scene);
virtual ~EffectsHandlerImpl();
virtual void prePaintScreen(ScreenPrePaintData& data, int time);
virtual void paintScreen(int mask, QRegion region, ScreenPaintData& data);
@@ -228,6 +228,7 @@ private:
QList< Effect* >::iterator m_currentPaintEffectFrameIterator;
QList< Effect* >::iterator m_currentPaintScreenIterator;
QList< Effect* >::iterator m_currentBuildQuadsIterator;
+ Scene *m_scene;
};
class EffectWindowImpl : public EffectWindow
diff --git a/events.cpp b/events.cpp
index a21e3f8480..074a8d67fa 100644
--- a/events.cpp
+++ b/events.cpp
@@ -443,17 +443,17 @@ bool Workspace::workspaceEvent(XEvent * e)
case Expose:
if (compositing()
&& (e->xexpose.window == rootWindow() // root window needs repainting
- || (scene->overlayWindow()->window() != None && e->xexpose.window == scene->overlayWindow()->window()))) { // overlay needs repainting
+ || (m_compositor->overlayWindow() != None && e->xexpose.window == m_compositor->overlayWindow()))) { // overlay needs repainting
if (m_compositor) {
m_compositor->addRepaint(e->xexpose.x, e->xexpose.y, e->xexpose.width, e->xexpose.height);
}
}
break;
case VisibilityNotify:
- if (compositing() && scene->overlayWindow()->window() != None && e->xvisibility.window == scene->overlayWindow()->window()) {
- bool was_visible = scene->overlayWindow()->isVisible();
- scene->overlayWindow()->setVisibility((e->xvisibility.state != VisibilityFullyObscured));
- if (!was_visible && scene->overlayWindow()->isVisible()) {
+ if (compositing() && m_compositor->overlayWindow() != None && e->xvisibility.window == m_compositor->overlayWindow()) {
+ bool was_visible = m_compositor->isOverlayWindowVisible();
+ m_compositor->setOverlayWindowVisibility((e->xvisibility.state != VisibilityFullyObscured));
+ if (!was_visible && m_compositor->isOverlayWindowVisible()) {
// hack for #154825
if (m_compositor) {
m_compositor->addRepaintFull();
diff --git a/paintredirector.cpp b/paintredirector.cpp
index 7ed4d6f545..7bc4bafb6c 100644
--- a/paintredirector.cpp
+++ b/paintredirector.cpp
@@ -24,11 +24,11 @@ DEALINGS IN THE SOFTWARE.
#include "paintredirector.h"
+#include "workspace.h"
#include
#include
#include
#include
-#include "utils.h"
namespace KWin
{
@@ -82,7 +82,7 @@ bool PaintRedirector::eventFilter(QObject* o, QEvent* e)
break;
}
case QEvent::Paint: {
- if (!compositing()) {
+ if (Workspace::self()->compositingActive()) {
return false;
}
if (!recursionCheck) {
diff --git a/scene.cpp b/scene.cpp
index 578251014c..6d847771ba 100644
--- a/scene.cpp
+++ b/scene.cpp
@@ -93,8 +93,6 @@ namespace KWin
// Scene
//****************************************
-Scene* scene = 0;
-
Scene::Scene(Workspace* ws)
: QObject(ws)
, wspace(ws)
@@ -102,6 +100,7 @@ Scene::Scene(Workspace* ws)
, m_overlayWindow(new OverlayWindow())
{
last_time.invalidate(); // Initialize the timer
+ connect(Workspace::self(), SIGNAL(deletedRemoved(KWin::Deleted*)), SLOT(windowDeleted(KWin::Deleted*)));
}
Scene::~Scene()
diff --git a/scene.h b/scene.h
index 38911986f8..1614ca4863 100644
--- a/scene.h
+++ b/scene.h
@@ -60,8 +60,6 @@ public:
// a new window has been created
virtual void windowAdded(Toplevel*) = 0;
- // a window has been destroyed
- virtual void windowDeleted(Deleted*) = 0;
/**
* Method invoked when the screen geometry is changed.
* Reimplementing classes should also invoke the parent method
@@ -100,6 +98,8 @@ public:
}
OverlayWindow* overlayWindow();
public Q_SLOTS:
+ // a window has been destroyed
+ virtual void windowDeleted(KWin::Deleted*) = 0;
// opacity of a window changed
virtual void windowOpacityChanged(KWin::Toplevel* c) = 0;
// shape/size of a window changed
@@ -244,8 +244,6 @@ protected:
EffectFrameImpl* m_effectFrame;
};
-extern Scene* scene;
-
inline
int Scene::Window::x() const
{
diff --git a/scene_opengl.cpp b/scene_opengl.cpp
index cbcc0cabdd..0372c039a2 100644
--- a/scene_opengl.cpp
+++ b/scene_opengl.cpp
@@ -208,7 +208,9 @@ void SceneOpenGL::paintBackground(QRegion region)
void SceneOpenGL::windowAdded(Toplevel* c)
{
assert(!windows.contains(c));
- windows[ c ] = new Window(c);
+ Window *w = new Window(c);
+ windows[ c ] = w;
+ w->setScene(this);
connect(c, SIGNAL(opacityChanged(KWin::Toplevel*,qreal)), SLOT(windowOpacityChanged(KWin::Toplevel*)));
connect(c, SIGNAL(geometryShapeChanged(KWin::Toplevel*,QRect)), SLOT(windowGeometryShapeChanged(KWin::Toplevel*)));
connect(c, SIGNAL(windowClosed(KWin::Toplevel*,KWin::Deleted*)), SLOT(windowClosed(KWin::Toplevel*,KWin::Deleted*)));
@@ -347,6 +349,7 @@ SceneOpenGL::Window::Window(Toplevel* c)
, leftTexture()
, rightTexture()
, bottomTexture()
+ , m_scene(NULL)
{
}
@@ -578,7 +581,7 @@ void SceneOpenGL::Window::performPaint(int mask, QRegion region, WindowPaintData
restoreStates(Content, data.opacity(), data.brightness(), data.saturation(), data.shader);
texture.unbind();
#ifndef KWIN_HAVE_OPENGLES
- if (static_cast(scene)->debug) {
+ if (m_scene && m_scene->debug) {
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
renderQuads(mask, region, contentQuads, &texture, false, hardwareClipping);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
@@ -652,7 +655,7 @@ void SceneOpenGL::Window::paintDecoration(const QPixmap* decoration, TextureType
restoreStates(decorationType, data.opacity() * data.decorationOpacity(), data.brightness(), data.saturation(), data.shader);
decorationTexture->unbind();
#ifndef KWIN_HAVE_OPENGLES
- if (static_cast(scene)->debug) {
+ if (m_scene && m_scene->debug) {
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
GLVertexBuffer::streamingBuffer()->render(region, GL_TRIANGLES, hardwareClipping);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
@@ -688,7 +691,7 @@ void SceneOpenGL::Window::paintShadow(const QRegion ®ion, const WindowPaintDa
restoreStates(Shadow, data.opacity(), data.brightness(), data.saturation(), data.shader, texture);
texture->unbind();
#ifndef KWIN_HAVE_OPENGLES
- if (static_cast(scene)->debug) {
+ if (m_scene && m_scene->debug) {
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
renderQuads(0, region, quads, texture, true, hardwareClipping);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
diff --git a/scene_opengl.h b/scene_opengl.h
index de33ce4d00..3e40a49234 100644
--- a/scene_opengl.h
+++ b/scene_opengl.h
@@ -168,6 +168,9 @@ public:
bool bindTexture();
void discardTexture();
void checkTextureSize();
+ void setScene(SceneOpenGL *scene) {
+ m_scene = scene;
+ }
protected:
enum TextureType {
@@ -199,6 +202,7 @@ private:
Texture leftTexture;
Texture rightTexture;
Texture bottomTexture;
+ SceneOpenGL *m_scene;
};
class SceneOpenGL::EffectFrame
diff --git a/toplevel.h b/toplevel.h
index aba932141c..777056904a 100644
--- a/toplevel.h
+++ b/toplevel.h
@@ -314,6 +314,10 @@ protected:
void getWmClientLeader();
void getWmClientMachine();
void setReadyForPainting();
+ /**
+ * @returns Whether there is a compositor and it is active.
+ **/
+ bool compositing() const;
/**
* This function fetches the opaque region from this Toplevel.
diff --git a/utils.h b/utils.h
index 9eb3589315..8fae0925fb 100644
--- a/utils.h
+++ b/utils.h
@@ -253,13 +253,6 @@ bool grabbedXServer();
bool grabXKeyboard(Window w = rootWindow());
void ungrabXKeyboard();
-class Scene;
-extern Scene* scene;
-inline bool compositing()
-{
- return scene != NULL;
-}
-
// the docs say it's UrgencyHint, but it's often #defined as XUrgencyHint
#ifndef UrgencyHint
#define UrgencyHint XUrgencyHint
diff --git a/workspace.cpp b/workspace.cpp
index b9cc258af1..4a69ef5aae 100644
--- a/workspace.cpp
+++ b/workspace.cpp
@@ -543,7 +543,7 @@ Client* Workspace::createClient(Window w, bool is_mapped)
Unmanaged* Workspace::createUnmanaged(Window w)
{
- if (compositing() && w == scene->overlayWindow()->window())
+ if (m_compositor && m_compositor->checkForOverlayWindow(w))
return NULL;
Unmanaged* c = new Unmanaged(this);
if (!c->track(w)) {
@@ -705,8 +705,6 @@ void Workspace::addDeleted(Deleted* c, Toplevel *orig, allowed_t)
void Workspace::removeDeleted(Deleted* c, allowed_t)
{
assert(deleted.contains(c));
- if (scene)
- scene->windowDeleted(c);
emit deletedRemoved(c);
deleted.removeAll(c);
unconstrained_stacking_order.removeAll(c);
@@ -1165,8 +1163,6 @@ unsigned int ObscuringWindows::max_cache_size = 0;
void ObscuringWindows::create(Client* c)
{
- if (compositing())
- return; // Not needed with compositing
if (cached == 0)
cached = new QList;
Window obs_win;
@@ -1244,7 +1240,7 @@ bool Workspace::setCurrentDesktop(int new_desktop)
continue;
}
if (!c->isOnDesktop(new_desktop) && c != movingClient && c->isOnCurrentActivity()) {
- if (c->isShown(true) && c->isOnDesktop(old_desktop))
+ if (c->isShown(true) && c->isOnDesktop(old_desktop) && !compositing())
obs_wins.create(c);
(c)->updateVisibility();
}
@@ -1465,7 +1461,7 @@ void Workspace::updateCurrentActivity(const QString &new_activity)
continue;
}
if (!c->isOnActivity(new_activity) && c != movingClient && c->isOnCurrentDesktop()) {
- if (c->isShown(true) && c->isOnActivity(old_activity))
+ if (c->isShown(true) && c->isOnActivity(old_activity) && !compositing())
obs_wins.create(c);
c->updateVisibility();
}
diff --git a/workspace.h b/workspace.h
index ccc4d86193..663c1da161 100644
--- a/workspace.h
+++ b/workspace.h
@@ -761,6 +761,11 @@ private:
static NET::WindowType txtToWindowType(const char* txt);
static bool sessionInfoWindowTypeMatch(Client* c, SessionInfo* info);
+ /**
+ * @returns Whether we have a Compositor and it is active (Scene created)
+ **/
+ bool compositing() const;
+
Client* active_client;
Client* last_active_client;
Client* most_recently_raised; // Used ONLY by raiseOrLowerClient()