-result<int> App::api_request_surface(char const *drawing_name) {
- auto lid = this->layers.get_layer_id(std::string(drawing_name));
- if (!lid) {
- // TODO: Do we need to put these applications on the App layer?
- return Err<int>("Drawing name does not match any role");
- }
-
- auto rname = this->lookup_id(drawing_name);
- if (!rname) {
- // name does not exist yet, allocate surface id...
- auto id = int(this->id_alloc.generate_id(drawing_name));
- this->layers.add_surface(id, *lid);
-
- // set the main_surface[_name] here and now
- if (!this->layers.main_surface_name.empty() &&
- this->layers.main_surface_name == drawing_name) {
- this->layers.main_surface = id;
- HMI_DEBUG("wm", "Set main_surface id to %u", id);
- }
-
- return Ok<int>(id);
- }
-
- // Check currently registered drawing names if it is already there.
- return Err<int>("Surface already present");
-}
-
-char const *App::api_request_surface(char const *drawing_name,
- char const *ivi_id) {
- ST();
-
- auto lid = this->layers.get_layer_id(std::string(drawing_name));
- unsigned sid = std::stol(ivi_id);
-
- if (!lid) {
- return "Drawing name does not match any role";
- }
-
- auto rname = this->lookup_id(drawing_name);
-
- if (rname) {
- return "Surface already present";
- }
-
- // register pair drawing_name and ivi_id
- this->id_alloc.register_name_id(drawing_name, sid);
- this->layers.add_surface(sid, *lid);
-
- // this surface is already created
- HMI_DEBUG("wm", "surface_id is %u, layer_id is %u", sid, *lid);
-
- this->controller->layers[*lid]->add_surface(
- this->controller->surfaces[sid].get());
-
- return nullptr;
-}
-
-void App::activate(int id) {
- auto ip = this->controller->sprops.find(id);
- if (ip != this->controller->sprops.end()) {
- this->controller->surfaces[id]->set_visibility(0);
- this->layout_commit();
- this->controller->surfaces[id]->set_visibility(1);
- char const *label =
- this->lookup_name(id).value_or("unknown-name").c_str();
-
- // FOR CES DEMO >>>
- if ((0 == strcmp(label, "Radio"))
- || (0 == strcmp(label, "MediaPlayer"))
- || (0 == strcmp(label, "Navigation"))) {
- for (auto i = surface_bg.begin(); i != surface_bg.end(); ++i) {
- if (id == *i) {
- // Remove id
- this->surface_bg.erase(i);
-
- // Remove from BG layer (999)
- HMI_DEBUG("wm", "Remove %s(%d) from BG layer", label, id);
- this->controller->layers[999]->remove_surface(
- this->controller->surfaces[id].get());
-
- // Add to FG layer (1001)
- HMI_DEBUG("wm", "Add %s(%d) to FG layer", label, id);
- this->controller->layers[1001]->add_surface(
- this->controller->surfaces[id].get());
-
- for (int j : this->surface_bg) {
- HMI_DEBUG("wm", "Stored id:%d", j);
- }
- break;
- }
- }
- }
- // <<< FOR CES DEMO
-
- this->emit_visible(label);
- this->emit_activated(label);
- }
-}
-
-void App::deactivate(int id) {
- auto ip = this->controller->sprops.find(id);
- if (ip != this->controller->sprops.end() && ip->second.visibility != 0) {
- char const *label =
- this->lookup_name(id).value_or("unknown-name").c_str();
-
- // FOR CES DEMO >>>
- if ((0 == strcmp(label, "Radio"))
- || (0 == strcmp(label, "MediaPlayer"))
- || (0 == strcmp(label, "Navigation"))) {
-
- // Store id
- this->surface_bg.push_back(id);
-
- // Remove from FG layer (1001)
- HMI_DEBUG("wm", "Remove %s(%d) from FG layer", label, id);
- this->controller->layers[1001]->remove_surface(
- this->controller->surfaces[id].get());
-
- // Add to BG layer (999)
- HMI_DEBUG("wm", "Add %s(%d) to BG layer", label, id);
- this->controller->layers[999]->add_surface(
- this->controller->surfaces[id].get());
-
- for (int j : surface_bg) {
- HMI_DEBUG("wm", "Stored id:%d", j);
- }
- }
- else {
- this->controller->surfaces[id]->set_visibility(0);
- }
- // <<< FOR CES DEMO
-
- this->emit_deactivated(label);
- this->emit_invisible(label);
- }
-}
-
-void App::deactivate_main_surface() {
- this->layers.main_surface = -1;
- this->api_deactivate_surface(this->layers.main_surface_name.c_str());
-}
-
-bool App::can_split(struct LayoutState const &state, int new_id) {
- if (state.main != -1 && 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(state.main).value();
-
- // surfaces are on separate layers, don't bother.
- if (new_id_layer != current_id_layer) {
- return false;
- }
-
- std::string const &new_id_str = this->lookup_name(new_id).value();
- std::string const &cur_id_str = this->lookup_name(state.main).value();
-
- auto const &layer = this->layers.get_layer(new_id_layer);
-
- HMI_DEBUG("wm", "layer info name: %s", layer->name.c_str());
-
- if (layer->layouts.empty()) {
- return false;
- }
-
- for (auto i = layer->layouts.cbegin(); i != layer->layouts.cend(); i++) {
- HMI_DEBUG("wm", "%d main_match '%s'", new_id_layer, i->main_match.c_str());
- auto rem = std::regex(i->main_match);
- if (std::regex_match(cur_id_str, rem)) {
- // build the second one only if the first already matched
- HMI_DEBUG("wm", "%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)) {
- HMI_DEBUG("wm", "layout matched!");
- return true;
+bool App::can_split(struct LayoutState const &state, int new_id)
+{
+ if (state.main != -1 && 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(state.main).value();
+
+ // surfaces are on separate layers, don't bother.
+ if (new_id_layer != current_id_layer)
+ {
+ return false;
+ }
+
+ std::string const &new_id_str = this->lookup_name(new_id).value();
+ std::string const &cur_id_str = this->lookup_name(state.main).value();
+
+ auto const &layer = this->layers.get_layer(new_id_layer);
+
+ HMI_DEBUG("wm", "layer info name: %s", layer->name.c_str());
+
+ if (layer->layouts.empty())
+ {
+ return false;
+ }
+
+ for (auto i = layer->layouts.cbegin(); i != layer->layouts.cend(); i++)
+ {
+ HMI_DEBUG("wm", "%d main_match '%s'", new_id_layer, i->main_match.c_str());
+ auto rem = std::regex(i->main_match);
+ if (std::regex_match(cur_id_str, rem))
+ {
+ // build the second one only if the first already matched
+ HMI_DEBUG("wm", "%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))
+ {
+ HMI_DEBUG("wm", "layout matched!");
+ return true;
+ }