5faa397849
for use in effects (and not only). Now a list of window quads (=window areas) is created at the beginning of the paint pass, prepaint calls can modify the split itself (i.e. divide it into more parts). The actual paint calls can then modify these quads (i.e. transform their geometry). This will allow better control of how the split is done and also allow painting e.g. only the decoration differently. Still work in progress, but it works. Also pass data to prepaint functions in a struct, as there is already quite a number of them. svn path=/trunk/KDE/kdebase/workspace/; revision=684893
235 lines
8.3 KiB
C++
235 lines
8.3 KiB
C++
/*****************************************************************
|
|
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_EFFECTSIMPL_H
|
|
#define KWIN_EFFECTSIMPL_H
|
|
|
|
#include "kwineffects.h"
|
|
|
|
#include "scene.h"
|
|
|
|
#include <QStack>
|
|
#include <QMap>
|
|
|
|
|
|
class KService;
|
|
|
|
|
|
namespace KWin
|
|
{
|
|
|
|
class EffectsHandlerImpl : public EffectsHandler
|
|
{
|
|
public:
|
|
EffectsHandlerImpl(CompositingType type);
|
|
virtual ~EffectsHandlerImpl();
|
|
virtual void prePaintScreen( ScreenPrePaintData& data, int time );
|
|
virtual void paintScreen( int mask, QRegion region, ScreenPaintData& data );
|
|
virtual void postPaintScreen();
|
|
virtual void prePaintWindow( EffectWindow* w, WindowPrePaintData& data, int time );
|
|
virtual void paintWindow( EffectWindow* w, int mask, QRegion region, WindowPaintData& data );
|
|
virtual void postPaintWindow( EffectWindow* w );
|
|
|
|
virtual void drawWindow( EffectWindow* w, int mask, QRegion region, WindowPaintData& data );
|
|
|
|
virtual void activateWindow( EffectWindow* c );
|
|
virtual EffectWindow* activeWindow() const;
|
|
virtual void moveWindow( EffectWindow* w, const QPoint& pos );
|
|
virtual void windowToDesktop( EffectWindow* w, int desktop );
|
|
|
|
virtual int currentDesktop() const;
|
|
virtual int numberOfDesktops() const;
|
|
virtual void setCurrentDesktop( int desktop );
|
|
virtual QString desktopName( int desktop ) const;
|
|
virtual int displayWidth() const;
|
|
virtual int displayHeight() const;
|
|
virtual QPoint cursorPos() const;
|
|
virtual bool grabKeyboard( Effect* effect );
|
|
virtual void ungrabKeyboard();
|
|
virtual EffectWindowList stackingOrder() const;
|
|
virtual void setElevatedWindow( EffectWindow* w, bool set );
|
|
|
|
virtual void setTabBoxWindow(EffectWindow*);
|
|
virtual void setTabBoxDesktop(int);
|
|
virtual EffectWindowList currentTabBoxWindowList() const;
|
|
virtual void refTabBox();
|
|
virtual void unrefTabBox();
|
|
virtual void closeTabBox();
|
|
virtual QList< int > currentTabBoxDesktopList() const;
|
|
virtual int currentTabBoxDesktop() const;
|
|
virtual EffectWindow* currentTabBoxWindow() const;
|
|
|
|
virtual void pushRenderTarget(GLRenderTarget* target);
|
|
virtual GLRenderTarget* popRenderTarget();
|
|
|
|
virtual void addRepaintFull();
|
|
virtual void addRepaint( const QRect& r );
|
|
virtual void addRepaint( int x, int y, int w, int h );
|
|
virtual QRect clientArea( clientAreaOption opt, const QPoint& p, int desktop ) const;
|
|
virtual void calcDesktopLayout(int* x, int* y, Qt::Orientation* orientation) const;
|
|
virtual bool optionRollOverDesktops() const;
|
|
|
|
virtual Window createInputWindow( Effect* e, int x, int y, int w, int h, const QCursor& cursor );
|
|
virtual void destroyInputWindow( Window w );
|
|
virtual bool checkInputWindowEvent( XEvent* e );
|
|
virtual void checkInputWindowStacking();
|
|
|
|
virtual void checkElectricBorder(const QPoint &pos, Time time);
|
|
virtual void reserveElectricBorder( ElectricBorder border );
|
|
virtual void unreserveElectricBorder( ElectricBorder border );
|
|
virtual void reserveElectricBorderSwitching( bool reserve );
|
|
|
|
virtual unsigned long xrenderBufferPicture();
|
|
virtual void reconfigure();
|
|
|
|
// internal (used by kwin core or compositing code)
|
|
void startPaint();
|
|
void windowUserMovedResized( EffectWindow* c, bool first, bool last );
|
|
void windowOpacityChanged( EffectWindow* c, double old_opacity );
|
|
void windowAdded( EffectWindow* c );
|
|
void windowClosed( EffectWindow* c );
|
|
void windowDeleted( EffectWindow* c );
|
|
void windowActivated( EffectWindow* c );
|
|
void windowMinimized( EffectWindow* c );
|
|
void windowUnminimized( EffectWindow* c );
|
|
void desktopChanged( int old );
|
|
void windowDamaged( EffectWindow* w, const QRect& r );
|
|
void windowGeometryShapeChanged( EffectWindow* w, const QRect& old );
|
|
void tabBoxAdded( int mode );
|
|
void tabBoxClosed();
|
|
void tabBoxUpdated();
|
|
bool borderActivated( ElectricBorder border );
|
|
void mouseChanged( const QPoint& pos, const QPoint& old,
|
|
Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers );
|
|
void grabbedKeyboardEvent( QKeyEvent* e );
|
|
bool hasKeyboardGrab() const;
|
|
|
|
void loadEffect( const QString& name );
|
|
void toggleEffect( const QString& name );
|
|
void unloadEffect( const QString& name );
|
|
void reloadEffect( const QString& name );
|
|
bool isEffectLoaded( const QString& name );
|
|
|
|
ToplevelList elevatedWindows() const;
|
|
|
|
protected:
|
|
KLibrary* findEffectLibrary( KService* service );
|
|
void effectsChanged();
|
|
|
|
Effect* keyboard_grab_effect;
|
|
QStack<GLRenderTarget*> render_targets;
|
|
ToplevelList elevated_windows;
|
|
QMultiMap< int, EffectPair > effect_order;
|
|
};
|
|
|
|
class EffectWindowImpl : public EffectWindow
|
|
{
|
|
public:
|
|
EffectWindowImpl();
|
|
virtual ~EffectWindowImpl();
|
|
|
|
virtual void enablePainting( int reason );
|
|
virtual void disablePainting( int reason );
|
|
virtual bool isPaintingEnabled();
|
|
virtual void addRepaint( const QRect& r );
|
|
virtual void addRepaint( int x, int y, int w, int h );
|
|
virtual void addRepaintFull();
|
|
|
|
virtual void refWindow();
|
|
virtual void unrefWindow();
|
|
virtual bool isDeleted() const;
|
|
|
|
virtual bool isOnAllDesktops() const;
|
|
virtual int desktop() const; // prefer isOnXXX()
|
|
virtual bool isMinimized() const;
|
|
virtual double opacity() const;
|
|
virtual QString caption() const;
|
|
virtual QPixmap icon() const;
|
|
virtual QString windowClass() const;
|
|
virtual const EffectWindowGroup* group() const;
|
|
|
|
virtual int x() const;
|
|
virtual int y() const;
|
|
virtual int width() const;
|
|
virtual int height() const;
|
|
virtual QRect geometry() const;
|
|
virtual QPoint pos() const;
|
|
virtual QSize size() const;
|
|
virtual QRect rect() const;
|
|
virtual bool isMovable() const;
|
|
virtual bool isUserMove() const;
|
|
virtual bool isUserResize() const;
|
|
virtual QRect iconGeometry() const;
|
|
|
|
virtual bool isDesktop() const;
|
|
virtual bool isDock() const;
|
|
virtual bool isToolbar() const;
|
|
virtual bool isTopMenu() const;
|
|
virtual bool isMenu() const;
|
|
virtual bool isNormalWindow() const; // normal as in 'NET::Normal or NET::Unknown non-transient'
|
|
virtual bool isSpecialWindow() const;
|
|
virtual bool isDialog() const;
|
|
virtual bool isSplash() const;
|
|
virtual bool isUtility() const;
|
|
virtual bool isDropdownMenu() const;
|
|
virtual bool isPopupMenu() const; // a context popup, not dropdown, not torn-off
|
|
virtual bool isTooltip() const;
|
|
virtual bool isNotification() const;
|
|
virtual bool isComboBox() const;
|
|
virtual bool isDNDIcon() const;
|
|
|
|
virtual bool isModal() const;
|
|
virtual EffectWindow* findModal();
|
|
virtual EffectWindowList mainWindows() const;
|
|
|
|
virtual void setShader(GLShader* shader);
|
|
|
|
const Toplevel* window() const;
|
|
Toplevel* window();
|
|
|
|
void setWindow( Toplevel* w ); // internal
|
|
void setSceneWindow( Scene::Window* w ); // internal
|
|
Scene::Window* sceneWindow(); // internal
|
|
private:
|
|
Toplevel* toplevel;
|
|
Scene::Window* sw; // This one is used only during paint pass.
|
|
};
|
|
|
|
class EffectWindowGroupImpl
|
|
: public EffectWindowGroup
|
|
{
|
|
public:
|
|
EffectWindowGroupImpl( Group* g );
|
|
virtual EffectWindowList members() const;
|
|
private:
|
|
Group* group;
|
|
};
|
|
|
|
|
|
inline
|
|
ToplevelList EffectsHandlerImpl::elevatedWindows() const
|
|
{
|
|
return elevated_windows;
|
|
}
|
|
|
|
|
|
inline
|
|
EffectWindowGroupImpl::EffectWindowGroupImpl( Group* g )
|
|
: group( g )
|
|
{
|
|
}
|
|
|
|
EffectWindow* effectWindow( Toplevel* w );
|
|
EffectWindow* effectWindow( Scene::Window* w );
|
|
|
|
|
|
} // namespace
|
|
|
|
#endif
|