+ unsigned old_current_screen = current_screen;
+
+ // push any invalidated screen first (for now)
+ for (unsigned i = 0; i < subscreens.size(); ++i) {
+ if (subscreens[i].screen->check_invalidated()) {
+ current_screen = i;
+ force = true;
+ }
+ }
+
+ // check if we want to go to the next screen
+ if (valid && !force && needs_update()) {
+ current_screen = (current_screen + 1) % subscreens.size();
+ gettimeofday(&last_update, NULL);
+ }
+
+ if (current_screen != old_current_screen || subscreens[current_screen].screen->check_invalidated()) {
+ // initialize a fade
+ in_fade = true;
+ fade_found_start_time = false;
+ same_fade = (current_screen == old_current_screen);
+
+ memcpy(fadefrom_buf, subscreens[old_current_screen].buf, 800 * 600 * 4);
+
+ if (subscreens[current_screen].screen->check_invalidated())
+ subscreens[current_screen].screen->draw(subscreens[current_screen].buf);
+ }
+ }