[SatipClient] Add new plugin.
[vuplus_dvbapp] / 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);
37         void removeRootWidget(eWidget *root);
38         
39                 /* try to move widget content. */
40                 /* returns -1 if there's no move support. */
41                 /* call this after recalcClipRegions for that widget. */
42                 /* you probably want to invalidate if -1 was returned. */
43         int movedWidget(eWidget *root);
44         
45         void recalcClipRegions(eWidget *root);
46         
47         void invalidateWidgetLayer(const gRegion &region, const eWidget *widget, int layer);
48         void invalidateWidget(const gRegion &region, const eWidget *widget, int layer = -1);
49         void invalidate(const gRegion &region, const eWidget *widget = 0, int layer = -1);
50         void paintLayer(eWidget *widget, int layer);
51         void paint();
52         void setDC(gDC *dc);
53         
54         void setBackgroundColor(gRGB col);
55         void setBackgroundColor(eWidgetDesktopCompBuffer *comp, gRGB col);
56         
57         void setPalette(gPixmap &pm);
58         
59         void setRedrawTask(eMainloop &ml);
60
61         void makeCompatiblePixmap(ePtr<gPixmap> &pm);
62         void makeCompatiblePixmap(gPixmap &pm);
63         
64         enum {
65                 cmImmediate,
66                 cmBuffered
67         };
68         
69         void setCompositionMode(int mode);
70         
71         int getStyleID() { return m_style_id; }
72         void setStyleID(int id) { m_style_id = id; }
73         
74         void resize(eSize size);
75         eSize size() const { return m_screen.m_screen_size; }
76         void sendShow(ePoint point, eSize size);
77         void sendHide(ePoint point, eSize size);
78 private:
79         ePtrList<eWidget> m_root;
80         void calcWidgetClipRegion(eWidget *widget, gRegion &parent_visible);
81         void paintBackground(eWidgetDesktopCompBuffer *comp);
82         
83         eMainloop *m_mainloop;
84         ePtr<eTimer> m_timer;
85         
86         int m_comp_mode;
87         int m_require_redraw;
88         
89         eWidgetDesktopCompBuffer m_screen;
90         
91         void createBufferForWidget(eWidget *widget, int layer);
92         void removeBufferForWidget(eWidget *widget, int layer);
93         
94         void redrawComposition(int notifed);
95         void notify();
96         
97         void clearVisibility(eWidget *widget);
98         
99         int m_style_id;
100 };
101
102 #endif