+ gRegion redraw = (background_before - m_screen.m_background_region) | (m_screen.m_background_region - background_before);
+ invalidate(redraw);
+ } else if (m_comp_mode == cmBuffered)
+ {
+ if (!root->m_vis & eWidget::wVisShow)
+ {
+ clearVisibility(root);
+ for (int i = 0; i < MAX_LAYER; ++i)
+ removeBufferForWidget(root, i);
+ return;
+ }
+
+ for (int i = 0; i < MAX_LAYER; ++i)
+ {
+ eWidgetDesktopCompBuffer *comp = root->m_comp_buffer[i];
+
+ /* TODO: layers might not be required to have the screen size, for memory reasons. */
+ if ((i == 0 && !comp) || (comp && (root->size() != comp->m_screen_size)))
+ createBufferForWidget(root, 0);
+
+ comp = root->m_comp_buffer[i]; /* it might have changed. */
+
+ /* CHECKME: don't we need to recalculate everything? after all, our buffer has changed and is likely to be cleared */
+ gRegion visible_before = root->m_visible_with_childs;
+
+ comp->m_background_region = gRegion(eRect(comp->m_position, comp->m_screen_size));
+
+ gRegion visible_new = root->m_visible_with_childs - visible_before;
+ gRegion visible_lost = visible_before - root->m_visible_with_childs;
+ visible_new.moveBy(root->position());
+ visible_lost.moveBy(root->position());
+
+ invalidate(visible_new, root, i);
+ invalidate(visible_lost, root, i);
+
+ calcWidgetClipRegion(root, comp->m_background_region);
+ }
+ }
+}
+
+void eWidgetDesktop::invalidateWidgetLayer(const gRegion ®ion, const eWidget *widget, int layer)
+{
+ if (m_comp_mode == cmImmediate)
+ {
+ invalidate(region);
+ return;