+ if (region.empty())
+ return;
+
+ if (m_timer && !m_require_redraw)
+ m_timer->start(0, 1); // start singleshot redraw timer
+
+ m_require_redraw = 1;
+
+ if (m_comp_mode == cmImmediate)
+ m_screen.m_dirty_region |= region;
+ else
+ for (ePtrList<eWidget>::iterator i(m_root.begin()); i != m_root.end(); ++i)
+ {
+ if (!(i->m_vis & eWidget::wVisShow))
+ continue;
+
+ eWidgetDesktopCompBuffer *comp = i->m_comp_buffer;
+
+ gRegion mregion = region;
+ comp->m_dirty_region |= mregion;
+ }
+}
+
+void eWidgetDesktop::setBackgroundColor(eWidgetDesktopCompBuffer *comp, gRGB col)
+{
+ comp->m_background_color = col;
+
+ /* if there's something visible from the background, redraw it with the new color. */
+ if (comp->m_dc && comp->m_background_region.valid() && !comp->m_background_region.empty())
+ {
+ /* todo: split out "setBackgroundColor / clear"... maybe? */
+ gPainter painter(comp->m_dc);
+ painter.resetClip(comp->m_background_region);
+ painter.setBackgroundColor(comp->m_background_color);
+ painter.clear();
+ }
+}
+
+void eWidgetDesktop::setBackgroundColor(gRGB col)
+{
+ setBackgroundColor(&m_screen, col);
+
+ if (m_comp_mode == cmBuffered)
+ for (ePtrList<eWidget>::iterator i(m_root.begin()); i != m_root.end(); ++i)
+ setBackgroundColor(i->m_comp_buffer, col);
+}
+
+void eWidgetDesktop::setPalette(gPixmap &pm)
+{
+// if (m_comp_mode == cmImmediate)
+ {
+ ASSERT(m_screen.m_dc);
+ gPainter painter(m_screen.m_dc);
+ painter.setPalette(&pm);
+ }
+
+ if (m_comp_mode == cmBuffered)
+ {
+ for (ePtrList<eWidget>::iterator i(m_root.begin()); i != m_root.end(); ++i)
+ {
+ ASSERT(i->m_comp_buffer->m_dc);
+ gPainter painter(i->m_comp_buffer->m_dc);
+ painter.setPalette(&pm);
+ }
+ }
+}
+
+void eWidgetDesktop::paintBackground(eWidgetDesktopCompBuffer *comp)
+{
+ comp->m_dirty_region &= comp->m_background_region;
+
+ gPainter painter(comp->m_dc);
+
+ painter.resetClip(comp->m_dirty_region);
+ painter.setBackgroundColor(comp->m_background_color);
+ painter.clear();
+ painter.flush();
+
+ comp->m_dirty_region = gRegion();