app/layout: fix split layout from and to transitions
[staging/windowmanager.git] / src / app.cpp
index 9b8f1fd..a6dd99c 100644 (file)
@@ -228,6 +228,7 @@ int App::init_layers() {
 
 namespace {
 
+#ifdef WE_LIKE_NOT_TO_USE_THIS
 // This can fix the HomeScreen...
 void redraw_fix(App *app, std::unique_ptr<genivi::surface> &s, int x, int y,
                 int w, int h) {
@@ -251,6 +252,7 @@ void redraw_fix(App *app, std::unique_ptr<genivi::surface> &s, int x, int y,
       app->display->roundtrip();
    }
 }
+#endif
 
 }  // namespace
 
@@ -298,12 +300,6 @@ void App::surface_set_layout_full(uint32_t surface_id) {
    // set destination to the display rectangle
    s->set_destination_rectangle(x, y, w, h);
 
-   s->set_visibility(0);
-   s->set_opacity(256);
-
-   this->controller->commit_changes();
-   this->display->roundtrip();
-
    //redraw_fix(this, s, x, y, w, h);
 
    logdebug("Surface %u now with rect { %d, %d, %d, %d }",
@@ -339,7 +335,7 @@ void App::surface_set_layout_split(uint32_t surface_id, uint32_t sub_surface_id)
 
    this->state.main = surface_id;
    this->state.sub = sub_surface_id;
-   this->state.state = LayoutState::LayoutSplit;
+   this->state.s = LayoutState::Split;
 
    // less-than-0 values refer to MAX + 1 - $VALUE
    // e.g. MAX is either screen width or height
@@ -369,9 +365,6 @@ void App::surface_set_layout_split(uint32_t surface_id, uint32_t sub_surface_id)
    // set destination to the display rectangle
    s->set_destination_rectangle(x, y, w, h);
 
-   s->set_visibility(1);
-   s->set_opacity(256);
-
    // configure surface to wxh dimensions
    ss->set_configuration(w, h);
    // set source reactangle, even if we should not need to set it.
@@ -379,12 +372,6 @@ void App::surface_set_layout_split(uint32_t surface_id, uint32_t sub_surface_id)
    // set destination to the display rectangle
    ss->set_destination_rectangle(x+x_off, y+y_off, w, h);
 
-   ss->set_visibility(1);
-   ss->set_opacity(256);
-
-   this->controller->commit_changes();
-   this->display->roundtrip();
-
    //redraw_fix(this, s, x, y, w, h);
    //redraw_fix(this, ss, x+x_off, y+y_off, w, h);
 
@@ -416,46 +403,50 @@ char const *App::activate_surface(char const *drawing_name) {
    // such a thing, we will just switch to this surface.
    // XXX: input focus missing!!1
 
-   if (this->state != LayoutState{}) {
-      switch (this->state.state) {
-         case LayoutState::LayoutSingle:
-            if (this->can_split(surface_id)) {
-               this->surface_set_layout_split(this->state.main, surface_id);
-               return nullptr;
-            }
-            break;
-
-         case LayoutState::LayoutSplit:
-            if (this->can_split(surface_id)) {
-               this->deactivate(this->state.sub);
-               this->surface_set_layout_split(this->state.main, surface_id);
-            }
-
-         case LayoutState::LayoutNone:
-            break;
-      }
-   }
-
    // Make it visible, no (or little effect) if already visible
    auto &s = this->controller->surfaces[surface_id];
 
-   // Set all others invisible
-   for (auto &i : this->controller->surfaces) {
-      auto &si = this->controller->sprops[i.second->id];
-      if (si.id != s->id && si.visibility != 0 &&
-          int(si.id) != this->layers.main_surface) {
-         this->deactivate(si.id);
+   //// Set all others invisible
+   //for (auto &i : this->controller->surfaces) {
+   //   auto &si = this->controller->sprops[i.second->id];
+   //   if (si.id != s->id && si.visibility != 0 &&
+   //       int(si.id) != this->layers.main_surface) {
+   //      this->deactivate(si.id);
+   //   }
+   //}
+
+   if (this->state.main == -1) {
+      this->surface_set_layout_full(surface_id);
+      this->activate(surface_id);
+      this->state.main = surface_id;
+      this->state.sub = -1;
+      this->state.s = LayoutState::Single;
+   } else {
+      bool can_split = this->can_split(surface_id);
+
+      if (this->state.sub == -1) {
+         if (can_split) {
+            if (this->state.main != surface_id) {
+               this->surface_set_layout_split(this->state.main,
+                                              this->state.sub = surface_id);
+               this->activate(this->state.sub);
+            }
+         } else {
+            this->surface_set_layout_full(surface_id);
+            this->deactivate(this->state.main);
+            this->activate(surface_id);
+            this->deactivate(this->state.sub);
+            this->state.main = surface_id;
+            this->state.sub = -1;
+            this->state.s = LayoutState::Single;
+         }
       }
    }
-   this->activate(s->id);
 
    // commit changes
    this->controller->commit_changes();
    this->display->flush();
 
-   this->state.main = surface_id;
-   this->state.state = LayoutState::LayoutSingle;
-
    // no error
    return nullptr;
 }
@@ -476,41 +467,30 @@ char const *App::deactivate_surface(char const *drawing_name) {
       return "Cannot deactivate main_surface";
    }
 
-   switch (this->state.state) {
-      case LayoutState::LayoutSplit:
-         if (surface_id == this->state.main) {
+   if (this->state.main == -1) {
+      return "No surface active";
+   } else {
+      if (this->state.main == surface_id) {
+         if (this->state.sub != -1) {
             this->deactivate(surface_id);
-            this->surface_set_layout_full(this->state.main);
-
-            this->deactivate(this->state.sub);
             this->surface_set_layout_full(this->state.sub);
-
-            this->state.main = -1;
+            this->state.main = this->state.sub;
             this->state.sub = -1;
-            this->state.state = LayoutState::LayoutSingle;
-         } else if (surface_id == this->state.sub) {
+            this->state.s = LayoutState::Single;
+         } else {
             this->deactivate(surface_id);
-            this->surface_set_layout_full(this->state.sub);
-            this->surface_set_layout_full(this->state.main);
-
-            // XXX send syndraw events....
-
-            this->state.sub = -1;
-            this->state.state = LayoutState::LayoutSingle;
+            this->state.main = -1;
          }
-         break;
-
-      case LayoutState::LayoutSingle:
+      }else if (this->state.sub == surface_id) {
          this->deactivate(surface_id);
-         this->state.main = -1;
+         this->surface_set_layout_full(this->state.main);
          this->state.sub = -1;
-         break;
-
-      case LayoutState::LayoutNone:
-         break;
+         this->state.s = LayoutState::Single;
+      } else {
+         return "Surface is not active";
+      }
    }
 
-
    this->controller->commit_changes();
    this->display->flush();
 
@@ -619,7 +599,7 @@ void App::deactivate(unsigned id) {
 }
 
 bool App::can_split(unsigned new_id) {
-   if (this->state.state == LayoutState::LayoutSingle) {
+   if (this->state.main != -1 && this->state.main != new_id) {
       auto new_id_layer = this->layers.get_layer_id(new_id).value();
       auto current_id_layer =
          this->layers.get_layer_id(this->state.main).value();
@@ -649,6 +629,7 @@ bool App::can_split(unsigned new_id) {
             logdebug("%d sub_match '%s'", new_id_layer, i->sub_match.c_str());
             auto res = std::regex(i->sub_match);
             if (std::regex_match(new_id_str, res)) {
+               logdebug("layout matched!");
                return true;
             }
          }