1 #include <lib/gui/ewidgetdesktop.h>
2 #include <lib/gui/ewidget.h>
3 #include <lib/base/ebase.h>
5 void eWidgetDesktop::addRootWidget(eWidget *root, int top)
7 assert(!root->m_desktop);
9 m_root.push_back(root);
11 m_root.push_front(root);
12 root->m_desktop = this;
15 void eWidgetDesktop::removeRootWidget(eWidget *root)
20 void eWidgetDesktop::calcWidgetClipRegion(eWidget *widget, gRegion &parent_visible)
22 /* start with our clip region, clipped with the parent's */
23 if (widget->m_vis & eWidget::wVisShow)
25 widget->m_visible_region = widget->m_clip_region;
26 widget->m_visible_region.moveBy(widget->position());
27 widget->m_visible_region &= parent_visible; // in parent space!
28 /* TODO: check transparency here! */
29 /* remove everything this widget will contain from parent's visible list */
30 parent_visible -= widget->m_visible_region; // will remove child regions too!
32 /* now prepare for recursing to childs */
33 widget->m_visible_region.moveBy(-widget->position()); // now in local space
35 widget->m_visible_region = gRegion();
37 widget->m_visible_with_childs = widget->m_visible_region;
39 for (ePtrList<eWidget>::iterator i(widget->m_childs.begin()); i != widget->m_childs.end(); ++i)
40 calcWidgetClipRegion(*i, widget->m_visible_region);
43 void eWidgetDesktop::recalcClipRegions()
45 gRegion screen = gRegion(eRect(ePoint(0, 0), m_screen_size));
47 for (ePtrList<eWidget>::iterator i(m_root.begin()); i != m_root.end(); ++i)
48 calcWidgetClipRegion(*i, screen);
49 // dumpRegion(screen);
52 void eWidgetDesktop::invalidate(const gRegion ®ion)
54 if (m_timer && m_dirty_region.empty())
55 m_timer->start(0, 1); // start singleshot redraw timer
56 m_dirty_region |= region;
59 void eWidgetDesktop::paint()
61 gPainter painter(m_dc);
62 /* walk all root windows. */
63 for (ePtrList<eWidget>::iterator i(m_root.begin()); i != m_root.end(); ++i)
64 i->doPaint(painter, m_dirty_region);
65 m_dirty_region = gRegion();
68 void eWidgetDesktop::setDC(gDC *dc)
73 void eWidgetDesktop::setRedrawTask(eMainloop &ml)
82 m_timer = new eTimer(m_mainloop);
83 CONNECT(m_timer->timeout, eWidgetDesktop::paint);
85 if (!m_dirty_region.empty())
89 eWidgetDesktop::eWidgetDesktop(eSize size): m_screen_size(size), m_mainloop(0), m_timer(0)
93 eWidgetDesktop::~eWidgetDesktop()