+
+ m_require_redraw = 1;
+
+ if (m_comp_mode == cmImmediate)
+ {
+ /* in immediate mode, we don't care for widget and layer, we use the topmost. */
+ m_screen.m_dirty_region |= region;
+ } else
+ {
+ if (!widget)
+ for (ePtrList<eWidget>::iterator i(m_root.begin()); i != m_root.end(); ++i)
+ invalidateWidget(region, i);
+ else
+ invalidateWidget(region, widget, layer);
+ }
+}
+
+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)
+ {
+ for (int l = 0; l < MAX_LAYER; ++l)
+ if (i->m_comp_buffer[l])
+ setBackgroundColor(i->m_comp_buffer[l], l ? gRGB(0, 0, 0, 0) : col); /* all layers above 0 will have a transparent background */
+ }
+}
+
+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)
+ {
+ for (int l = 0; l < MAX_LAYER; ++l)
+ {
+ if (!i->m_comp_buffer[l])
+ continue;
+ ASSERT(i->m_comp_buffer[l]->m_dc);
+ gPainter painter(i->m_comp_buffer[l]->m_dc);
+ painter.setPalette(&pm);
+ }
+ }
+ }
+}
+
+void eWidgetDesktop::paintBackground(eWidgetDesktopCompBuffer *comp)
+{
+ if (!comp)
+ return;
+
+ 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();
+
+ comp->m_dirty_region = gRegion();
+}
+
+
+void eWidgetDesktop::paintLayer(eWidget *widget, int layer)
+{
+ eWidgetDesktopCompBuffer *comp = (m_comp_mode == cmImmediate) ? &m_screen : widget->m_comp_buffer[layer];
+ if (m_comp_mode == cmImmediate)
+ ASSERT(layer == 0);
+ if (!comp)
+ return;
+ gPainter painter(comp->m_dc);
+ painter.moveOffset(-comp->m_position);
+ widget->doPaint(painter, comp->m_dirty_region, layer);
+ painter.resetOffset();