X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/4ebd765cac9f8a7ae4934147ed876a9e228eeb8d..1c4c06d35a9e13dc60d820c4077e76c363f1a965:/lib/gui/ewidgetdesktop.cpp diff --git a/lib/gui/ewidgetdesktop.cpp b/lib/gui/ewidgetdesktop.cpp index dcc2ef60..c89cd270 100644 --- a/lib/gui/ewidgetdesktop.cpp +++ b/lib/gui/ewidgetdesktop.cpp @@ -51,10 +51,10 @@ void eWidgetDesktop::calcWidgetClipRegion(eWidget *widget, gRegion &parent_visib widget->m_visible_region = widget->m_clip_region; widget->m_visible_region.moveBy(widget->position()); widget->m_visible_region &= parent_visible; // in parent space! - /* TODO: check transparency here! */ - /* remove everything this widget will contain from parent's visible list */ - parent_visible -= widget->m_visible_region; // will remove child regions too! + if (!widget->isTransparent()) + /* remove everything this widget will contain from parent's visible list, unless widget is transparent. */ + parent_visible -= widget->m_visible_region; // will remove child regions too! /* now prepare for recursing to childs */ widget->m_visible_region.moveBy(-widget->position()); // now in local space @@ -63,9 +63,22 @@ void eWidgetDesktop::calcWidgetClipRegion(eWidget *widget, gRegion &parent_visib widget->m_visible_with_childs = widget->m_visible_region; - for (ePtrList::iterator i(widget->m_childs.begin()); i != widget->m_childs.end(); ++i) - if (i->m_vis & eWidget::wVisShow) - calcWidgetClipRegion(*i, widget->m_visible_region); + /* add childs in reverse (Z) order - we're going from front-to-bottom here. */ + ePtrList::iterator i(widget->m_childs.end()); + + for (;;) + { + if (i != widget->m_childs.end()) + { + if (i->m_vis & eWidget::wVisShow) + calcWidgetClipRegion(*i, widget->m_visible_region); + else + clearVisibility(*i); + } + if (i == widget->m_childs.begin()) + break; + --i; + } } void eWidgetDesktop::recalcClipRegions(eWidget *root) @@ -79,7 +92,10 @@ void eWidgetDesktop::recalcClipRegions(eWidget *root) for (ePtrList::iterator i(m_root.begin()); i != m_root.end(); ++i) { if (!(i->m_vis & eWidget::wVisShow)) + { + clearVisibility(i); continue; + } gRegion visible_before = i->m_visible_with_childs; @@ -94,10 +110,11 @@ void eWidgetDesktop::recalcClipRegions(eWidget *root) gRegion redraw = (background_before - m_screen.m_background_region) | (m_screen.m_background_region - background_before); invalidate(redraw); - } else + } else if (m_comp_mode == cmBuffered) { if (!root->m_vis & eWidget::wVisShow) { + clearVisibility(root); removeBufferForWidget(root); return; } @@ -266,7 +283,7 @@ void eWidgetDesktop::makeCompatiblePixmap(gPixmap &pm) if (m_comp_mode != cmImmediate) return; - eDebug("widgetDesktop: make compatible pixmap of %p\n", &pm); +// eDebug("widgetDesktop: make compatible pixmap of %p", &pm); if (!m_screen.m_dc) { eWarning("eWidgetDesktop: no DC to make pixmap compatible with!"); @@ -387,3 +404,10 @@ void eWidgetDesktop::notify() { redrawComposition(1); } + +void eWidgetDesktop::clearVisibility(eWidget *widget) +{ + widget->m_visible_with_childs = gRegion(); + for (ePtrList::iterator i(widget->m_childs.begin()); i != widget->m_childs.end(); ++i) + clearVisibility(*i); +}