X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/ba02fb4aced5868d047a5bffbd2ed87583daee4d..cd621fe499141885e5a0d8b4e42a0f8a7f41a9ac:/lib/gui/ewidgetdesktop.cpp diff --git a/lib/gui/ewidgetdesktop.cpp b/lib/gui/ewidgetdesktop.cpp index ff913680..1b5cf9b2 100644 --- a/lib/gui/ewidgetdesktop.cpp +++ b/lib/gui/ewidgetdesktop.cpp @@ -1,5 +1,6 @@ #include #include +#include void eWidgetDesktop::addRootWidget(eWidget *root, int top) { @@ -41,24 +42,46 @@ void eWidgetDesktop::calcWidgetClipRegion(eWidget *widget, gRegion &parent_visib void eWidgetDesktop::recalcClipRegions() { - gRegion screen = gRegion(eRect(ePoint(0, 0), m_screen_size)); + m_background_region = gRegion(eRect(ePoint(0, 0), m_screen_size)); for (ePtrList::iterator i(m_root.begin()); i != m_root.end(); ++i) - calcWidgetClipRegion(*i, screen); -// dumpRegion(screen); + calcWidgetClipRegion(*i, m_background_region); } void eWidgetDesktop::invalidate(const gRegion ®ion) { + if (m_timer && m_dirty_region.empty()) + m_timer->start(0, 1); // start singleshot redraw timer m_dirty_region |= region; } +void eWidgetDesktop::setBackgroundColor(gColor col) +{ + m_background_color = col; + + /* if there's something visible from the background, redraw it with the new color. */ + if (m_dc && m_background_region.valid() && !m_background_region.empty()) + { + /* todo: split out "setBackgroundColor / clear"... maybe? */ + gPainter painter(m_dc); + painter.resetClip(m_background_region); + painter.setBackgroundColor(m_background_color); + painter.clear(); + } +} + void eWidgetDesktop::paint() { gPainter painter(m_dc); /* walk all root windows. */ for (ePtrList::iterator i(m_root.begin()); i != m_root.end(); ++i) i->doPaint(painter, m_dirty_region); + m_dirty_region &= m_background_region; + + painter.resetClip(m_dirty_region); + painter.setBackgroundColor(m_background_color); + painter.clear(); + m_dirty_region = gRegion(); } @@ -67,7 +90,23 @@ void eWidgetDesktop::setDC(gDC *dc) m_dc = dc; } -eWidgetDesktop::eWidgetDesktop(eSize size): m_screen_size(size) +void eWidgetDesktop::setRedrawTask(eMainloop &ml) +{ + if (m_mainloop) + { + delete m_timer; + m_timer = 0; + m_mainloop = 0; + } + m_mainloop = &ml; + m_timer = new eTimer(m_mainloop); + CONNECT(m_timer->timeout, eWidgetDesktop::paint); + + if (!m_dirty_region.empty()) + m_timer->start(0, 1); +} + +eWidgetDesktop::eWidgetDesktop(eSize size): m_screen_size(size), m_mainloop(0), m_timer(0) { }