- create DCs for buffered mode
[enigma2.git] / lib / gui / ewidgetdesktop.h
1 #ifndef __lib_gui_ewidgetdesktop_h
2 #define __lib_gui_ewidgetdesktop_h
3
4 #include <lib/gdi/grc.h>
5 #include <lib/base/eptrlist.h>
6
7 class eWidget;
8 class eMainloop;
9 class eTimer;
10
11                 /* an eWidgetDesktopCompBuffer is a composition buffer. in 
12                    immediate composition  mode, we only have one composition 
13                    buffer - the screen.
14                    in buffered mode, we have one buffer for each widget, plus
15                    the screen.
16                    
17                    even in buffered mode, we have a background region, because
18                    a window can be arbitrary shaped. the screen size acts as a bounding
19                    box in these cases. */
20
21 struct eWidgetDesktopCompBuffer
22 {
23         ePoint m_position;
24         eSize m_screen_size;
25         gRegion m_dirty_region;
26         gRegion m_background_region;
27         ePtr<gDC> m_dc;
28         gRGB m_background_color;
29 };
30
31 class eWidgetDesktop: public Object
32 {
33 public:
34         eWidgetDesktop(eSize screen);
35         ~eWidgetDesktop();
36         void addRootWidget(eWidget *root, int top);
37         void removeRootWidget(eWidget *root);
38         void recalcClipRegions();
39         
40         void invalidate(const gRegion &region);
41         void paint();
42         void setDC(gDC *dc);
43         
44         void setBackgroundColor(gRGB col);
45         void setBackgroundColor(eWidgetDesktopCompBuffer *comp, gRGB col);
46         
47         void setPalette(gPixmap &pm);
48         
49         void setRedrawTask(eMainloop &ml);
50         
51         void makeCompatiblePixmap(gPixmap &pm);
52         
53         enum {
54                 cmImmediate,
55                 cmBuffered
56         };
57         
58         void setCompositionMode(int mode);
59 private:
60         ePtrList<eWidget> m_root;
61         void calcWidgetClipRegion(eWidgetDesktopCompBuffer *comp, eWidget *widget, gRegion &parent_visible);
62         void paintBackground(eWidgetDesktopCompBuffer *comp);
63         
64         eMainloop *m_mainloop;
65         eTimer *m_timer;
66         
67         int m_comp_mode;
68         int m_require_redraw;
69         
70         eWidgetDesktopCompBuffer m_screen;
71         
72         void createBufferForWidget(eWidget *widget);
73         void removeBufferForWidget(eWidget *widget);
74         
75         void redrawComposition();
76 };
77
78 #endif