app: emit syncdraw and flushdraw events
authorMarcus Fritzsch <marcus_fritzsch@mentor.com>
Tue, 12 Sep 2017 09:29:31 +0000 (11:29 +0200)
committerMarcus Fritzsch <marcus_fritzsch@mentor.com>
Tue, 12 Sep 2017 09:29:31 +0000 (11:29 +0200)
Signed-off-by: Marcus Fritzsch <marcus_fritzsch@mentor.com>
src/app.cpp

index 7c95151..040e0b0 100644 (file)
@@ -164,7 +164,6 @@ int App::dispatch_events() {
 
 int App::dispatch_pending_events() {
    if (this->pop_pending_events()) {
-      assert(this->pending_events == false);
       this->display->dispatch_pending();
       return 0;
    }
@@ -399,22 +398,35 @@ char const *App::activate_surface(char const *drawing_name) {
    // XXX: input focus missing!!1
 
    if (this->state.main == -1) {
+      this->emit_syncdraw(drawing_name);
+
       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;
+
+      this->emit_flushdraw(drawing_name);
    } else {
       bool can_split = this->can_split(*surface_id);
 
       if (this->state.sub == -1) {
          if (can_split) {
             if (this->state.main != *surface_id) {
+               this->emit_syncdraw(drawing_name);
+               this->emit_syncdraw(this->lookup_name(this->state.main)->c_str());
+
                this->surface_set_layout_split(this->state.main, *surface_id);
                this->activate(*surface_id);
                this->state.sub = *surface_id;
+
+               // Should wait for EndDraw event...
+               this->emit_flushdraw(drawing_name);
+               this->emit_flushdraw(this->lookup_name(this->state.main)->c_str());
             }
          } else {
+            this->emit_syncdraw(drawing_name);
+
             this->surface_set_layout_full(*surface_id);
             this->deactivate(this->state.main);
             this->activate(*surface_id);
@@ -422,6 +434,8 @@ char const *App::activate_surface(char const *drawing_name) {
             this->state.main = *surface_id;
             this->state.sub = -1;
             this->state.s = LayoutState::Single;
+
+            this->emit_flushdraw(drawing_name);
          }
       }
    }
@@ -447,26 +461,35 @@ char const *App::deactivate_surface(char const *drawing_name) {
 
    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.sub);
-            this->state.main = this->state.sub;
-            this->state.sub = -1;
-            this->state.s = LayoutState::Single;
-         } else {
-            this->deactivate(*surface_id);
-            this->state.main = -1;
-         }
-      }else if (this->state.sub == *surface_id) {
+   }
+
+   if (this->state.main == *surface_id) {
+      if (this->state.sub != -1) {
+         this->emit_syncdraw(this->lookup_name(this->state.sub)->c_str());
+
          this->deactivate(*surface_id);
-         this->surface_set_layout_full(this->state.main);
+         this->surface_set_layout_full(this->state.sub);
+         this->state.main = this->state.sub;
          this->state.sub = -1;
          this->state.s = LayoutState::Single;
+
+         this->emit_flushdraw(this->lookup_name(this->state.sub)->c_str());
       } else {
-         return "Surface is not active";
+         this->deactivate(*surface_id);
+         this->state.main = -1;
       }
+   }else if (this->state.sub == *surface_id) {
+      this->emit_syncdraw(this->lookup_name(this->state.main)->c_str());
+
+      this->deactivate(*surface_id);
+      this->deactivate(*surface_id);
+      this->surface_set_layout_full(this->state.main);
+      this->state.sub = -1;
+      this->state.s = LayoutState::Single;
+
+      this->emit_flushdraw(this->lookup_name(this->state.main)->c_str());
+   } else {
+      return "Surface is not active";
    }
 
    this->controller->commit_changes();
@@ -484,8 +507,6 @@ char const *App::deactivate_surface(char const *drawing_name) {
 void App::surface_created(uint32_t surface_id) {
    logdebug("surface_id is %u", surface_id);
 
-   this->surface_set_layout_full(surface_id);
-
    this->controller->layers[this->layers.get_layer_id(surface_id).value()]
            ->add_surface(this->controller->surfaces[surface_id].get());
 
@@ -524,9 +545,9 @@ void App::emit_visible(char const *label, bool is_visible) {
    this->api.send_event(is_visible ? "visible" : "invisible", label);
 }
 
-void App::emit_invisible(char const *label) { return emit_visible(label, 0); }
+void App::emit_invisible(char const *label) { return emit_visible(label, false); }
 
-void App::emit_visible(char const *label) { return emit_visible(label, 1); }
+void App::emit_visible(char const *label) { return emit_visible(label, true); }
 
 result<int> App::request_surface(char const *drawing_name) {
    auto lid = this->layers.get_layer_id(std::string(drawing_name));