1 #include <lib/gui/ewidgetdesktop.h>
2 #include <lib/gui/ewidget.h>
4 void eWidgetDesktop::addRootWidget(eWidget *root, int top)
6 assert(!root->m_desktop);
8 m_root.push_back(root);
10 m_root.push_front(root);
11 root->m_desktop = this;
14 void eWidgetDesktop::calcWidgetClipRegion(eWidget *widget, gRegion &parent_visible)
16 /* start with our clip region, clipped with the parent's */
17 if (widget->m_vis & eWidget::wVisShow)
19 widget->m_visible_region = widget->m_clip_region;
20 widget->m_visible_region.moveBy(widget->position());
21 widget->m_visible_region &= parent_visible; // in parent space!
22 /* TODO: check transparency here! */
23 /* remove everything this widget will contain from parent's visible list */
24 parent_visible -= widget->m_visible_region; // will remove child regions too!
26 /* now prepare for recursing to childs */
27 widget->m_visible_region.moveBy(-widget->position()); // now in local space
29 widget->m_visible_region = gRegion();
31 widget->m_visible_with_childs = widget->m_visible_region;
33 for (ePtrList<eWidget>::iterator i(widget->m_childs.begin()); i != widget->m_childs.end(); ++i)
34 calcWidgetClipRegion(*i, widget->m_visible_region);
37 void eWidgetDesktop::recalcClipRegions()
39 gRegion screen = gRegion(eRect(ePoint(0, 0), m_screen_size));
41 for (ePtrList<eWidget>::iterator i(m_root.begin()); i != m_root.end(); ++i)
42 calcWidgetClipRegion(*i, screen);
43 // dumpRegion(screen);
46 void eWidgetDesktop::invalidate(const gRegion ®ion)
48 m_dirty_region |= region;
51 void eWidgetDesktop::paint()
53 gPainter painter(m_dc);
54 /* walk all root windows. */
55 for (ePtrList<eWidget>::iterator i(m_root.begin()); i != m_root.end(); ++i)
56 i->doPaint(painter, m_dirty_region);
57 m_dirty_region = gRegion();
60 void eWidgetDesktop::setDC(gDC *dc)
65 eWidgetDesktop::eWidgetDesktop(eSize size): m_screen_size(size)
69 eWidgetDesktop::~eWidgetDesktop()