X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/c4a14f843f363645e85bda24d03d68c6afcda9fa..5c471ed8362098ad535177010c7b15957a586234:/lib/gui/ewidgetdesktop.h?ds=sidebyside diff --git a/lib/gui/ewidgetdesktop.h b/lib/gui/ewidgetdesktop.h index c917e36a..af772bd2 100644 --- a/lib/gui/ewidgetdesktop.h +++ b/lib/gui/ewidgetdesktop.h @@ -8,14 +8,28 @@ class eWidget; class eMainloop; class eTimer; -class eWidgetDesktop: public Object + /* an eWidgetDesktopCompBuffer is a composition buffer. in + immediate composition mode, we only have one composition + buffer - the screen. + in buffered mode, we have one buffer for each widget, plus + the screen. + + even in buffered mode, we have a background region, because + a window can be arbitrary shaped. the screen size acts as a bounding + box in these cases. */ + +struct eWidgetDesktopCompBuffer { -public: // weil debug + ePoint m_position; eSize m_screen_size; gRegion m_dirty_region; gRegion m_background_region; ePtr m_dc; gRGB m_background_color; +}; + +class eWidgetDesktop: public Object +{ public: eWidgetDesktop(eSize screen); ~eWidgetDesktop(); @@ -28,18 +42,35 @@ public: void setDC(gDC *dc); void setBackgroundColor(gRGB col); + void setBackgroundColor(eWidgetDesktopCompBuffer *comp, gRGB col); void setPalette(gPixmap &pm); void setRedrawTask(eMainloop &ml); void makeCompatiblePixmap(gPixmap &pm); + + enum { + cmImmediate, + cmBuffered + }; + + void setCompositionMode(int mode); private: ePtrList m_root; - void calcWidgetClipRegion(eWidget *widget, gRegion &parent_visible); + void calcWidgetClipRegion(eWidgetDesktopCompBuffer *comp, eWidget *widget, gRegion &parent_visible); + void paintBackground(eWidgetDesktopCompBuffer *comp); eMainloop *m_mainloop; eTimer *m_timer; + + int m_comp_mode; + int m_require_redraw; + + eWidgetDesktopCompBuffer m_screen; + + void createBufferForWidget(eWidget *widget); + void removeBufferForWidget(eWidget *widget); }; #endif