KWin
scene.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef KWIN_SCENE_H
00022 #define KWIN_SCENE_H
00023
00024 #include <QDateTime>
00025
00026 #include "toplevel.h"
00027 #include "utils.h"
00028 #include "kwineffects.h"
00029
00030 namespace KWin
00031 {
00032
00033 class Workspace;
00034 class Deleted;
00035 class EffectWindowImpl;
00036
00037
00038 class Scene
00039 {
00040 public:
00041 Scene( Workspace* ws );
00042 virtual ~Scene() = 0;
00043 class Window;
00044
00045
00046 virtual bool initFailed() const = 0;
00047 virtual CompositingType compositingType() const = 0;
00048
00049
00050 virtual void paint( QRegion damage, ToplevelList windows ) = 0;
00051
00052
00053
00054
00055
00056 virtual void windowGeometryShapeChanged( Toplevel* ) = 0;
00057
00058 virtual void windowOpacityChanged( Toplevel* ) = 0;
00059
00060 virtual void windowAdded( Toplevel* ) = 0;
00061
00062 virtual void windowClosed( Toplevel*, Deleted* ) = 0;
00063
00064 virtual void windowDeleted( Deleted* ) = 0;
00065
00066 enum
00067 {
00068
00069 PAINT_WINDOW_OPAQUE = 1 << 0,
00070
00071 PAINT_WINDOW_TRANSLUCENT = 1 << 1,
00072
00073 PAINT_WINDOW_TRANSFORMED = 1 << 2,
00074
00075
00076 PAINT_SCREEN_REGION = 1 << 3,
00077
00078 PAINT_SCREEN_TRANSFORMED = 1 << 4,
00079
00080 PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS = 1 << 5,
00081
00082 PAINT_SCREEN_BACKGROUND_FIRST = 1 << 6
00083 };
00084
00085 enum ImageFilterType { ImageFilterFast, ImageFilterGood };
00086
00087 void idle();
00088 bool waitSyncAvailable() { return has_waitSync; }
00089 protected:
00090
00091 void paintScreen( int* mask, QRegion* region );
00092 friend class EffectsHandlerImpl;
00093
00094 void finalPaintScreen( int mask, QRegion region, ScreenPaintData& data );
00095
00096
00097 virtual void paintGenericScreen( int mask, ScreenPaintData data );
00098
00099 virtual void paintSimpleScreen( int mask, QRegion region );
00100
00101 virtual void paintBackground( QRegion region ) = 0;
00102
00103 void finalPaintWindow( EffectWindowImpl* w, int mask, QRegion region, WindowPaintData& data );
00104
00105 virtual void paintWindow( Window* w, int mask, QRegion region, WindowQuadList quads );
00106
00107 void finalDrawWindow( EffectWindowImpl* w, int mask, QRegion region, WindowPaintData& data );
00108
00109 void updateTimeDiff();
00110
00111 struct Phase2Data
00112 {
00113 Phase2Data( Window* w, QRegion r, QRegion c, int m, const WindowQuadList& q )
00114 : window( w ), region( r ), clip( c ), mask( m ), quads( q ) {}
00115 Phase2Data() { window = 0; mask = 0; }
00116 Window* window;
00117 QRegion region;
00118 QRegion clip;
00119 int mask;
00120 WindowQuadList quads;
00121 };
00122
00123 QVector< Window* > stacking_order;
00124
00125
00126
00127
00128
00129 QRegion painted_region;
00130
00131 int time_diff;
00132 QTime last_time;
00133 Workspace* wspace;
00134 bool has_waitSync;
00135 };
00136
00137
00138 class Scene::Window
00139 {
00140 public:
00141 Window( Toplevel* c );
00142 virtual ~Window();
00143
00144 virtual void performPaint( int mask, QRegion region, WindowPaintData data ) = 0;
00145
00146 virtual void pixmapDiscarded() {}
00147 int x() const;
00148 int y() const;
00149 int width() const;
00150 int height() const;
00151 QRect geometry() const;
00152 QPoint pos() const;
00153 QSize size() const;
00154 QRect rect() const;
00155
00156
00157 Toplevel* window();
00158
00159 bool isPaintingEnabled() const;
00160 void resetPaintingEnabled();
00161
00162 enum
00163 {
00164
00165 PAINT_DISABLED = 1 << 0,
00166
00167 PAINT_DISABLED_BY_DELETE = 1 << 1,
00168
00169 PAINT_DISABLED_BY_DESKTOP = 1 << 2,
00170
00171 PAINT_DISABLED_BY_MINIMIZE = 1 << 3
00172 };
00173 void enablePainting( int reason );
00174 void disablePainting( int reason );
00175
00176 bool isVisible() const;
00177
00178 bool isOpaque() const;
00179
00180 QRegion shape() const;
00181 void discardShape();
00182 void updateToplevel( Toplevel* c );
00183
00184 virtual WindowQuadList buildQuads() const;
00185 protected:
00186 WindowQuadList makeQuads( WindowQuadType type, const QRegion& reg ) const;
00187 Toplevel* toplevel;
00188 ImageFilterType filter;
00189 private:
00190 int disable_painting;
00191 mutable QRegion shape_region;
00192 mutable bool shape_valid;
00193 mutable WindowQuadList* cached_quad_list;
00194 Q_DISABLE_COPY(Window)
00195 };
00196
00197 extern Scene* scene;
00198
00199 inline
00200 int Scene::Window::x() const
00201 {
00202 return toplevel->x();
00203 }
00204
00205 inline
00206 int Scene::Window::y() const
00207 {
00208 return toplevel->y();
00209 }
00210
00211 inline
00212 int Scene::Window::width() const
00213 {
00214 return toplevel->width();
00215 }
00216
00217 inline
00218 int Scene::Window::height() const
00219 {
00220 return toplevel->height();
00221 }
00222
00223 inline
00224 QRect Scene::Window::geometry() const
00225 {
00226 return toplevel->geometry();
00227 }
00228
00229 inline
00230 QSize Scene::Window::size() const
00231 {
00232 return toplevel->size();
00233 }
00234
00235 inline
00236 QPoint Scene::Window::pos() const
00237 {
00238 return toplevel->pos();
00239 }
00240
00241 inline
00242 QRect Scene::Window::rect() const
00243 {
00244 return toplevel->rect();
00245 }
00246
00247 inline
00248 Toplevel* Scene::Window::window()
00249 {
00250 return toplevel;
00251 }
00252
00253 inline
00254 void Scene::Window::updateToplevel( Toplevel* c )
00255 {
00256 toplevel = c;
00257 }
00258
00259 }
00260
00261 #endif