app: comment on surface visiblity and layout setup
[staging/windowmanager.git] / src / app.cpp
index e14984e..6a7f5b4 100644 (file)
@@ -213,8 +213,7 @@ int App::dispatch_events() {
    this->display->flush();
 
    // execute pending tasks, that is layout changes etc.
-   this->controller->execute_pending();
-   this->display->roundtrip();
+   this->execute_pending();
 
    return 0;
 }
@@ -313,6 +312,8 @@ void App::surface_set_layout(uint32_t surface_id) {
    // set destination to the display rectangle
    s->set_destination_rectangle(x, y, w, h);
 
+   // XXX: visibility should be determined independently of our
+   //      layer + geometry setup.
    s->set_visibility(1);
    this->controller->layers[layer_id]->add_surface(s.get());
 
@@ -320,6 +321,22 @@ void App::surface_set_layout(uint32_t surface_id) {
             surface_id, layer_id, x, y, w, h);
 }
 
+void App::add_task(char const *name, std::function<void()> &&f) {
+   this->pending.emplace_back(std::make_pair(name, f));
+}
+
+void App::execute_pending() {
+   if (!this->pending.empty()) {
+      for (auto &t : this->pending) {
+         logdebug("executing task '%s'", t.first);
+         t.second();
+      }
+      this->pending.clear();
+      this->controller->commit_changes();
+      this->display->flush();
+   }
+}
+
 //                      _          _   _____                 _
 //  _ __  _ __ _____  _(_) ___  __| | | ____|_   _____ _ __ | |_ ___
 // | '_ \| '__/ _ \ \/ / |/ _ \/ _` | |  _| \ \ / / _ \ '_ \| __/ __|
@@ -331,10 +348,8 @@ void App::surface_created(uint32_t surface_id) {
 
    // We need to execute the surface setup after its creation.
    // XXX: perhaps move the late-tasks functionality to App?
-   this->controller->add_task("surface_set_layout",
-                              [surface_id, this](struct genivi::controller *) {
-                                 this->surface_set_layout(surface_id);
-                              });
+   this->add_task("surface_set_layout",
+                  [surface_id, this] { this->surface_set_layout(surface_id); });
 }
 
 void App::surface_removed(uint32_t surface_id) {
@@ -401,4 +416,8 @@ void controller_hooks::surface_removed(uint32_t surface_id) {
    this->app->surface_removed(surface_id);
 }
 
+void controller_hooks::add_task(char const *name, std::function<void()> &&f) {
+   this->app->add_task(name, std::move(f));
+}
+
 }  // namespace wm