Prepare for scene rendering with different engines.
svn path=/branches/work/kwin_composite/; revision=558442
This commit is contained in:
parent
e76564c165
commit
afcc9b6897
11 changed files with 227 additions and 49 deletions
|
@ -43,6 +43,9 @@ set(kwin_KDEINIT_SRCS
|
|||
composite.cpp
|
||||
toplevel.cpp
|
||||
unmanaged.cpp
|
||||
scene.cpp
|
||||
scene_basic.cpp
|
||||
scene_xrender.cpp
|
||||
effects.cpp )
|
||||
|
||||
kde4_automoc(${kwin_KDEINIT_SRCS})
|
||||
|
|
|
@ -12,7 +12,8 @@ License. See the file "COPYING" for the exact licensing terms.
|
|||
#include "workspace.h"
|
||||
#include "client.h"
|
||||
#include "unmanaged.h"
|
||||
#include "effects.h"
|
||||
#include "scene.h"
|
||||
#include "scene_basic.h"
|
||||
|
||||
namespace KWinInternal
|
||||
{
|
||||
|
@ -26,22 +27,24 @@ void Workspace::setupCompositing()
|
|||
{
|
||||
if( !Extensions::compositeAvailable() || !Extensions::damageAvailable())
|
||||
return;
|
||||
if( composite_pixmap != None )
|
||||
if( scene != NULL )
|
||||
return;
|
||||
// TODO start tracking unmanaged windows
|
||||
compositeTimer.start( 20 );
|
||||
XCompositeRedirectSubwindows( display(), rootWindow(), CompositeRedirectManual );
|
||||
composite_pixmap = XCreatePixmap( display(), rootWindow(), displayWidth(), displayHeight(), QX11Info::appDepth());
|
||||
setDamaged();
|
||||
scene = new SceneBasic( this );
|
||||
}
|
||||
|
||||
void Workspace::finishCompositing()
|
||||
{
|
||||
if( composite_pixmap == None )
|
||||
if( scene == NULL )
|
||||
return;
|
||||
XCompositeUnredirectSubwindows( display(), rootWindow(), CompositeRedirectManual );
|
||||
XFreePixmap( display(), composite_pixmap );
|
||||
compositeTimer.stop();
|
||||
composite_pixmap = None;
|
||||
// TODO stop tracking unmanaged windows
|
||||
delete scene;
|
||||
scene = NULL;
|
||||
}
|
||||
|
||||
void Workspace::setDamaged()
|
||||
|
@ -55,6 +58,7 @@ void Workspace::compositeTimeout()
|
|||
{
|
||||
if( !damaged )
|
||||
return;
|
||||
damaged = false;
|
||||
ToplevelList windows;
|
||||
Window* children;
|
||||
unsigned int children_count;
|
||||
|
@ -65,44 +69,15 @@ void Workspace::compositeTimeout()
|
|||
++i )
|
||||
{
|
||||
if( Client* c = findClient( FrameIdMatchPredicate( children[ i ] )))
|
||||
windows.append( c );
|
||||
{
|
||||
if( c->isShown( true ) && c->isOnCurrentDesktop())
|
||||
windows.append( c );
|
||||
}
|
||||
else if( Unmanaged* c = findUnmanaged( HandleMatchPredicate( children[ i ] )))
|
||||
windows.append( c );
|
||||
}
|
||||
XGCValues val;
|
||||
val.foreground = WhitePixel( display(), DefaultScreen( display()));
|
||||
val.subwindow_mode = IncludeInferiors;
|
||||
GC gc = XCreateGC( display(), composite_pixmap, GCForeground | GCSubwindowMode, &val );
|
||||
XFillRectangle( display(), composite_pixmap, gc, 0, 0, displayWidth(), displayHeight());
|
||||
for( ToplevelList::ConstIterator it = windows.begin();
|
||||
it != windows.end();
|
||||
++it )
|
||||
{
|
||||
if( Client* c = dynamic_cast< Client* >( *it ))
|
||||
{
|
||||
if( !c->isShown( true ) || !c->isOnCurrentDesktop())
|
||||
continue;
|
||||
}
|
||||
#if 1
|
||||
(*it)->windowPixmap(); // trigger creation
|
||||
effects->paintWindow( *it );
|
||||
#else
|
||||
QRect r = (*it)->geometry().intersect( QRect( 0, 0, displayWidth(), displayHeight()));
|
||||
if( !r.isEmpty())
|
||||
{
|
||||
XCopyArea( display(), (*it)->windowPixmap(), composite_pixmap, gc,
|
||||
qMax( 0, -(*it)->x()), qMax( 0, -(*it)->y()), r.width(), r.height(), r.x(), r.y());
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#if 1
|
||||
effects->paintWorkspace( this );
|
||||
#else
|
||||
XCopyArea( display(), composite_pixmap, rootWindow(), gc, 0, 0, displayWidth(), displayHeight(), 0, 0 );
|
||||
#endif
|
||||
XFreeGC( display(), gc );
|
||||
XFlush( display());
|
||||
damaged = false;
|
||||
scene->setWindows( windows );
|
||||
scene->paint();
|
||||
}
|
||||
|
||||
//****************************************
|
||||
|
@ -111,7 +86,7 @@ void Workspace::compositeTimeout()
|
|||
|
||||
void Toplevel::setupCompositing()
|
||||
{
|
||||
if( !workspace()->compositing())
|
||||
if( !compositing())
|
||||
return;
|
||||
if( damage != None )
|
||||
return;
|
||||
|
@ -134,14 +109,14 @@ void Toplevel::finishCompositing()
|
|||
|
||||
void Toplevel::setDamaged()
|
||||
{
|
||||
if( !workspace()->compositing())
|
||||
if( !compositing())
|
||||
return;
|
||||
workspace()->setDamaged();
|
||||
}
|
||||
|
||||
void Toplevel::resetWindowPixmap()
|
||||
{
|
||||
if( !workspace()->compositing())
|
||||
if( !compositing())
|
||||
return;
|
||||
if( window_pixmap != None )
|
||||
XFreePixmap( display(), window_pixmap );
|
||||
|
@ -150,7 +125,7 @@ void Toplevel::resetWindowPixmap()
|
|||
|
||||
Pixmap Toplevel::windowPixmap() const
|
||||
{
|
||||
if( window_pixmap == None && workspace()->compositing())
|
||||
if( window_pixmap == None && compositing())
|
||||
window_pixmap = XCompositeNameWindowPixmap( display(), handle());
|
||||
return window_pixmap;
|
||||
}
|
||||
|
|
36
scene.cpp
Normal file
36
scene.cpp
Normal file
|
@ -0,0 +1,36 @@
|
|||
/*****************************************************************
|
||||
KWin - the KDE window manager
|
||||
This file is part of the KDE project.
|
||||
|
||||
Copyright (C) 2006 Lubos Lunak <l.lunak@kde.org>
|
||||
|
||||
You can Freely distribute this program under the GNU General Public
|
||||
License. See the file "COPYING" for the exact licensing terms.
|
||||
******************************************************************/
|
||||
|
||||
#include "scene_basic.h"
|
||||
|
||||
namespace KWinInternal
|
||||
{
|
||||
|
||||
//****************************************
|
||||
// Scene
|
||||
//****************************************
|
||||
|
||||
Scene::Scene( Workspace* ws )
|
||||
: wspace( ws )
|
||||
{
|
||||
}
|
||||
|
||||
Scene::~Scene()
|
||||
{
|
||||
}
|
||||
|
||||
void Scene::setWindows( const ToplevelList& list )
|
||||
{
|
||||
windows = list;
|
||||
}
|
||||
|
||||
Scene* scene;
|
||||
|
||||
} // namespace
|
37
scene.h
Normal file
37
scene.h
Normal file
|
@ -0,0 +1,37 @@
|
|||
/*****************************************************************
|
||||
KWin - the KDE window manager
|
||||
This file is part of the KDE project.
|
||||
|
||||
Copyright (C) 2006 Lubos Lunak <l.lunak@kde.org>
|
||||
|
||||
You can Freely distribute this program under the GNU General Public
|
||||
License. See the file "COPYING" for the exact licensing terms.
|
||||
******************************************************************/
|
||||
|
||||
#ifndef KWIN_SCENE_H
|
||||
#define KWIN_SCENE_H
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
namespace KWinInternal
|
||||
{
|
||||
|
||||
class Workspace;
|
||||
|
||||
class Scene
|
||||
{
|
||||
public:
|
||||
Scene( Workspace* ws );
|
||||
virtual ~Scene();
|
||||
void setWindows( const ToplevelList& list );
|
||||
virtual void paint() = 0;
|
||||
protected:
|
||||
Workspace* wspace;
|
||||
ToplevelList windows;
|
||||
};
|
||||
|
||||
extern Scene* scene;
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif
|
57
scene_basic.cpp
Normal file
57
scene_basic.cpp
Normal file
|
@ -0,0 +1,57 @@
|
|||
/*****************************************************************
|
||||
KWin - the KDE window manager
|
||||
This file is part of the KDE project.
|
||||
|
||||
Copyright (C) 2006 Lubos Lunak <l.lunak@kde.org>
|
||||
|
||||
You can Freely distribute this program under the GNU General Public
|
||||
License. See the file "COPYING" for the exact licensing terms.
|
||||
******************************************************************/
|
||||
|
||||
#include "scene_basic.h"
|
||||
|
||||
#include "utils.h"
|
||||
#include "client.h"
|
||||
|
||||
namespace KWinInternal
|
||||
{
|
||||
|
||||
//****************************************
|
||||
// SceneBasic
|
||||
//****************************************
|
||||
|
||||
SceneBasic::SceneBasic( Workspace* ws )
|
||||
: Scene( ws )
|
||||
{
|
||||
}
|
||||
|
||||
SceneBasic::~SceneBasic()
|
||||
{
|
||||
}
|
||||
|
||||
void SceneBasic::paint()
|
||||
{
|
||||
Pixmap composite_pixmap = XCreatePixmap( display(), rootWindow(), displayWidth(), displayHeight(), QX11Info::appDepth());
|
||||
XGCValues val;
|
||||
val.foreground = WhitePixel( display(), DefaultScreen( display()));
|
||||
val.subwindow_mode = IncludeInferiors;
|
||||
GC gc = XCreateGC( display(), composite_pixmap, GCForeground | GCSubwindowMode, &val );
|
||||
XFillRectangle( display(), composite_pixmap, gc, 0, 0, displayWidth(), displayHeight());
|
||||
for( ToplevelList::ConstIterator it = windows.begin();
|
||||
it != windows.end();
|
||||
++it )
|
||||
{
|
||||
QRect r = (*it)->geometry().intersect( QRect( 0, 0, displayWidth(), displayHeight()));
|
||||
if( !r.isEmpty())
|
||||
{
|
||||
XCopyArea( display(), (*it)->windowPixmap(), composite_pixmap, gc,
|
||||
qMax( 0, -(*it)->x()), qMax( 0, -(*it)->y()), r.width(), r.height(), r.x(), r.y());
|
||||
}
|
||||
}
|
||||
XCopyArea( display(), composite_pixmap, rootWindow(), gc, 0, 0, displayWidth(), displayHeight(), 0, 0 );
|
||||
XFreeGC( display(), gc );
|
||||
XFreePixmap( display(), composite_pixmap );
|
||||
XFlush( display());
|
||||
}
|
||||
|
||||
} // namespace
|
31
scene_basic.h
Normal file
31
scene_basic.h
Normal file
|
@ -0,0 +1,31 @@
|
|||
/*****************************************************************
|
||||
KWin - the KDE window manager
|
||||
This file is part of the KDE project.
|
||||
|
||||
Copyright (C) 2006 Lubos Lunak <l.lunak@kde.org>
|
||||
|
||||
You can Freely distribute this program under the GNU General Public
|
||||
License. See the file "COPYING" for the exact licensing terms.
|
||||
******************************************************************/
|
||||
|
||||
#ifndef KWIN_SCENE_BASIC_H
|
||||
#define KWIN_SCENE_BASIC_H
|
||||
|
||||
#include "scene.h"
|
||||
|
||||
namespace KWinInternal
|
||||
{
|
||||
|
||||
class SceneBasic
|
||||
: public Scene
|
||||
{
|
||||
public:
|
||||
SceneBasic( Workspace* ws );
|
||||
virtual ~SceneBasic();
|
||||
virtual void paint();
|
||||
};
|
||||
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif
|
20
scene_xrender.cpp
Normal file
20
scene_xrender.cpp
Normal file
|
@ -0,0 +1,20 @@
|
|||
/*****************************************************************
|
||||
KWin - the KDE window manager
|
||||
This file is part of the KDE project.
|
||||
|
||||
Copyright (C) 2006 Lubos Lunak <l.lunak@kde.org>
|
||||
|
||||
You can Freely distribute this program under the GNU General Public
|
||||
License. See the file "COPYING" for the exact licensing terms.
|
||||
******************************************************************/
|
||||
|
||||
#include "scene_xrender.h"
|
||||
|
||||
namespace KWinInternal
|
||||
{
|
||||
|
||||
//****************************************
|
||||
// SceneXrender
|
||||
//****************************************
|
||||
|
||||
} // namespace
|
19
scene_xrender.h
Normal file
19
scene_xrender.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
/*****************************************************************
|
||||
KWin - the KDE window manager
|
||||
This file is part of the KDE project.
|
||||
|
||||
Copyright (C) 2006 Lubos Lunak <l.lunak@kde.org>
|
||||
|
||||
You can Freely distribute this program under the GNU General Public
|
||||
License. See the file "COPYING" for the exact licensing terms.
|
||||
******************************************************************/
|
||||
|
||||
#ifndef KWIN_SCENE_XRENDER_H
|
||||
#define KWIN_SCENE_XRENDER_H
|
||||
|
||||
namespace KWinInternal
|
||||
{
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif
|
4
utils.h
4
utils.h
|
@ -250,6 +250,10 @@ int displayHeight()
|
|||
return XDisplayHeight( display(), DefaultScreen( display()));
|
||||
}
|
||||
|
||||
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
|
||||
|
|
|
@ -124,7 +124,6 @@ Workspace::Workspace( bool restore )
|
|||
set_active_client_recursion( 0 ),
|
||||
block_stacking_updates( 0 ),
|
||||
forced_global_mouse_grab( false ),
|
||||
composite_pixmap( None ),
|
||||
damaged( false )
|
||||
{
|
||||
new KWinAdaptor( "org.kde.kwin", "/KWin", QDBus::sessionBus(), this );
|
||||
|
|
|
@ -78,8 +78,6 @@ class Workspace : public QObject, public KDecorationDefines
|
|||
|
||||
static Workspace * self() { return _self; }
|
||||
|
||||
bool compositing() const { return composite_pixmap != None; }
|
||||
|
||||
bool workspaceEvent( XEvent * );
|
||||
|
||||
KDecoration* createDecoration( KDecorationBridge* bridge );
|
||||
|
@ -632,7 +630,6 @@ class Workspace : public QObject, public KDecorationDefines
|
|||
bool forced_global_mouse_grab;
|
||||
friend class StackingUpdatesBlocker;
|
||||
|
||||
Pixmap composite_pixmap;
|
||||
bool damaged;
|
||||
QTimer compositeTimer;
|
||||
|
||||
|
|
Loading…
Reference in a new issue