-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");
-}
-
-result<json_object *> App::api_get_display_info() {
- // Check controller
- if (!this->controller) {
- return Err<json_object *>("ivi_controller global not available");
- }
-
- // Set display info
- compositor::size o_size = this->controller->output_size;
- compositor::size p_size = this->controller->physical_size;
-
- json_object *object = json_object_new_object();
- json_object_object_add(object, kKeyWidthPixel, json_object_new_int(o_size.w));
- json_object_object_add(object, kKeyHeightPixel, json_object_new_int(o_size.h));
- json_object_object_add(object, kKeyWidthMm, json_object_new_int(p_size.w));
- json_object_object_add(object, kKeyHeightMm, json_object_new_int(p_size.h));
-
- return Ok<json_object *>(object);
-}
-
-result<json_object *> App::api_get_area_info(char const *drawing_name) {
- HMI_DEBUG("wm", "called");
-
- // Check drawing name, surface/layer id
- auto const &surface_id = this->lookup_id(drawing_name);
- if (!surface_id) {
- return Err<json_object *>("Surface does not exist");
- }
-
- if (!this->controller->surface_exists(*surface_id)) {
- return Err<json_object *>("Surface does not exist in controller!");
- }
-
- auto layer_id = this->layers.get_layer_id(*surface_id);
- if (!layer_id) {
- return Err<json_object *>("Surface is not on any layer!");
- }
-
- auto o_state = *this->layers.get_layout_state(*surface_id);
- if (o_state == nullptr) {
- return Err<json_object *>("Could not find layer for surface");
- }
-
- struct LayoutState &state = *o_state;
- if ((state.main != *surface_id) && (state.sub != *surface_id)) {
- return Err<json_object *>("Surface is inactive");
- }
-
- // Set area rectangle
- compositor::rect area_info = this->area_info[*surface_id];
- json_object *object = json_object_new_object();
- json_object_object_add(object, kKeyX, json_object_new_int(area_info.x));
- json_object_object_add(object, kKeyY, json_object_new_int(area_info.y));
- json_object_object_add(object, kKeyWidth, json_object_new_int(area_info.w));
- json_object_object_add(object, kKeyHeight, json_object_new_int(area_info.h));
-
- return Ok<json_object *>(object);
-}
-
-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();
- 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) {
- this->controller->surfaces[id]->set_visibility(0);
- char const *label =
- this->lookup_name(id).value_or("unknown-name").c_str();
- 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;
+ }