X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fapp.cpp;h=8208e8b7eecf5e3dbf84606169af67cd6970f8c6;hb=f8e49ab7a90503ff791e264d61d5b658b0b4fad0;hp=3751fd3ad9ec75926b27c8374342b4cb6f367117;hpb=875547362223909f750d4ab2f536735e5b344fc8;p=staging%2Fwindowmanager.git diff --git a/src/app.cpp b/src/app.cpp index 3751fd3..8208e8b 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -235,9 +235,7 @@ int App::init_layers() { // Add layers to screen (XXX: are they sorted correctly?) s->set_render_order(this->layers.layers); - c->commit_changes(); - - this->display->flush(); + this->layout_commit(); return 0; } @@ -353,6 +351,11 @@ void App::surface_set_layout(int surface_id, optional sub_surface_id) { surface_id, layer_id, x, y, w, h); } +void App::layout_commit() { + this->controller->commit_changes(); + this->display->flush(); +} + char const *App::api_activate_surface(char const *drawing_name) { ST(); auto const &surface_id = this->lookup_id(drawing_name); @@ -401,8 +404,7 @@ char const *App::api_activate_surface(char const *drawing_name) { l.state.s = LayoutState::Single; if (flush) { - this->controller->commit_changes(); - this->display->flush(); + this->layout_commit(); } } @@ -418,11 +420,12 @@ char const *App::api_activate_surface(char const *drawing_name) { this->emit_syncdraw(drawing_name); this->surface_set_layout(*surface_id); - this->activate(*surface_id); + this->activate(*surface_id); // XXX do we need to activate after enddraw? state.main = *surface_id; state.sub = -1; state.s = LayoutState::Single; + this->layout_commit(); this->enqueue_flushdraw(state.main); } else { bool can_split = this->can_split(state, *surface_id); @@ -438,6 +441,7 @@ char const *App::api_activate_surface(char const *drawing_name) { this->activate(*surface_id); state.sub = *surface_id; + this->layout_commit(); this->enqueue_flushdraw(state.main); this->enqueue_flushdraw(state.sub); } @@ -452,15 +456,12 @@ char const *App::api_activate_surface(char const *drawing_name) { state.sub = -1; state.s = LayoutState::Single; + this->layout_commit(); this->enqueue_flushdraw(state.main); } } } - // commit changes - this->controller->commit_changes(); - this->display->flush(); - // no error return nullptr; } @@ -489,6 +490,7 @@ char const *App::api_deactivate_surface(char const *drawing_name) { return "No surface active"; } + // XXX: check against main_surface, main_surface_name is the configuration item. if (*surface_id == this->layers.main_surface) { logdebug("Refusing to deactivate main_surface %d", *surface_id); return nullptr; @@ -505,6 +507,7 @@ char const *App::api_deactivate_surface(char const *drawing_name) { state.sub = -1; state.s = LayoutState::Single; + this->layout_commit(); this->enqueue_flushdraw(state.sub); } else { this->deactivate(*surface_id); @@ -520,14 +523,12 @@ char const *App::api_deactivate_surface(char const *drawing_name) { state.sub = -1; state.s = LayoutState::Single; + this->layout_commit(); this->enqueue_flushdraw(state.main); } else { return "Surface is not active"; } - this->controller->commit_changes(); - this->display->flush(); - return nullptr; } @@ -569,6 +570,11 @@ void App::api_ping() { this->dispatch_pending_events(); } +void App::deactivate_main_surface() { + this->layers.main_surface = -1; + this->api_deactivate_surface(this->layers.main_surface_name.c_str()); +} + // _ _ _____ _ // _ __ _ __ _____ _(_) ___ __| | | ____|_ _____ _ __ | |_ ___ // | '_ \| '__/ _ \ \/ / |/ _ \/ _` | | _| \ \ / / _ \ '_ \| __/ __| @@ -600,12 +606,19 @@ void App::surface_created(uint32_t surface_id) { void App::surface_removed(uint32_t surface_id) { logdebug("surface_id is %u", surface_id); - auto drawing_name = this->lookup_name(surface_id); - if (drawing_name) { - this->api_deactivate_surface(drawing_name->c_str()); + // We cannot normally deactivate the main_surface, so be explicit + // about it: + if (int(surface_id) == this->layers.main_surface) { + this->deactivate_main_surface(); + } else { + auto drawing_name = this->lookup_name(surface_id); + if (drawing_name) { + this->api_deactivate_surface(drawing_name->c_str()); + } } this->id_alloc.remove_id(surface_id); + this->layers.remove_surface(surface_id); } void App::emit_activated(char const *label) {