- 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());
-
- /* this sucks, obviously. */
- invalidate(visible_new);
- invalidate(visible_lost);
-
- calcWidgetClipRegion(root, comp->m_background_region);
+ /* 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. */
+
+ if (!comp)
+ continue; /* WAIT, don't we need to invalidate,whatever */
+
+ /* 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);
+ }