X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/35278519b9b44c9543126e06841b1cfb8510eb82..db6ca522bdfbde29c214b41435a10876ff72a0a4:/lib/gui/ewidgetdesktop.cpp diff --git a/lib/gui/ewidgetdesktop.cpp b/lib/gui/ewidgetdesktop.cpp index fb0f39dd..223b5c86 100644 --- a/lib/gui/ewidgetdesktop.cpp +++ b/lib/gui/ewidgetdesktop.cpp @@ -5,18 +5,27 @@ extern void dumpRegion(const gRegion ®ion); -void eWidgetDesktop::addRootWidget(eWidget *root, int top) +void eWidgetDesktop::addRootWidget(eWidget *root) { assert(!root->m_desktop); + int invert_sense = 0; /* buffered mode paints back-to-front, while immediate mode is front-to-back. */ if (m_comp_mode == cmBuffered) - top = !top; + invert_sense = 1; + + ePtrList::iterator insert_position = m_root.begin(); + + for (;;) + { + if ((insert_position == m_root.end()) || (invert_sense ^ (insert_position->m_z_position > root->m_z_position))) + { + m_root.insert(insert_position, root); + break; + } + ++insert_position; + } - if (top) - m_root.push_back(root); - else - m_root.push_front(root); root->m_desktop = this; /* the creation will be postponed. */ @@ -51,10 +60,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,11 +72,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); - else - clearVisibility(*i); + /* 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) @@ -272,7 +292,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!"); @@ -314,6 +334,12 @@ eWidgetDesktop::eWidgetDesktop(eSize size): m_mainloop(0), m_timer(0) eWidgetDesktop::~eWidgetDesktop() { + /* tell registered root windows that they no longer have a desktop. */ + for (ePtrList::iterator i(m_root.begin()); i != m_root.end(); ) + { + i->m_desktop = 0; + i = m_root.erase(i); + } /* destroy all buffers */ setCompositionMode(-1); }