X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fwm_layer_control.cpp;h=f3f709fbb6fea610ad3ef034ca31c363cfd770d1;hb=refs%2Ftags%2Ficefish_8.99.3;hp=5b801f777a11c75f82507822f96ddafdb50bd502;hpb=8501d1f32139212ad1b26eaf08dabf42edab9c9a;p=apps%2Fagl-service-windowmanager.git diff --git a/src/wm_layer_control.cpp b/src/wm_layer_control.cpp index 5b801f7..f3f709f 100644 --- a/src/wm_layer_control.cpp +++ b/src/wm_layer_control.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) 2017 TOYOTA MOTOR CORPORATION - * Copyright (c) 2018 Konsulko Group + * Copyright (c) 2018,2019 Konsulko Group * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ #define LC_AREA_FILE "areas.json" #define LC_LAYER_SETTING_FILE "layers.json" #define LC_DEFAULT_AREA "fullscreen" +#define LC_REMOTE_DEFAULT_AREA "remote.fullscreen" #define BACK_GROUND_LAYER "BackGroundLayer" using std::string; @@ -103,6 +104,18 @@ WMError LayerControl::init(const LayerControlCallbacks& cb) // Currently, 0 is only available this->screenID = ids[0]; + if (1 < num) + { + // TODO: set remote screen id + HMI_INFO("There is remote screen (id:%d)", ids[1]); + this->remoteScreenID = ids[1]; + } + else + { + HMI_INFO("There is no remote screen"); + this->remoteScreenID = -1; + } + rc = ilm_getPropertiesOfScreen(this->screenID, &this->screen_prop); if(rc != ILM_SUCCESS) goto lc_init_error; @@ -119,10 +132,10 @@ lc_init_error: return WMError::FAIL; } -void LayerControl::createNewLayer(unsigned id) +void LayerControl::createNewLayer(unsigned id, bool remote) { - HMI_INFO("create new ID :%d", id); - struct rect rct = this->area2size[LC_DEFAULT_AREA]; + HMI_INFO("create new ID :%d%s", id, remote ? " (For remote layer)" : ""); + struct rect rct = this->area2size[remote ? LC_REMOTE_DEFAULT_AREA : LC_DEFAULT_AREA]; ilm_layerCreateWithDimension(&id, rct.w, rct.h); //ilm_layerSetSourceRectangle(id, rct.x, rct.y, rct.w, rct.h); ilm_layerSetDestinationRectangle(id, this->offset_x, this->offset_y, rct.w, rct.h); @@ -131,10 +144,11 @@ void LayerControl::createNewLayer(unsigned id) ilm_commitChanges(); auto wm_layer = getWMLayer(id); wm_layer->addLayerToState(id); + wm_layer->setRemote(remote); this->renderLayers(); } -unsigned LayerControl::getNewLayerID(const string& role) +unsigned LayerControl::getNewLayerID(const string& role, std::string* layer_name) { unsigned ret = 0; for(const auto& l: this->wm_layers) @@ -144,6 +158,10 @@ unsigned LayerControl::getNewLayerID(const string& role) { unsigned wmlid = l->getWMLayerID(); this->lid2wmlid[ret] = wmlid; + if(layer_name) + { + *layer_name = l->layerName(); + } break; } } @@ -206,17 +224,29 @@ WMError LayerControl::renderLayers() HMI_INFO("Commit change"); WMError rc = WMError::SUCCESS; + bool haveRemoteDisplay = remoteScreenID > 0; + // Check the number of layers vector ivi_l_ids; + vector ivi_remote_l_ids; for(auto& l : this->wm_layers) { auto state = l->getLayerState(); HMI_DEBUG("layer %s", l->layerName().c_str()); - for(const auto& id : state.getIviIdList()) + if (!l->isRemote()) { - HMI_DEBUG("Add %d", id); - ivi_l_ids.push_back(id); - } + for(const auto& id : state.getIviIdList()) + { + HMI_DEBUG("Add %d", id); + ivi_l_ids.push_back(id); + } + } else if (haveRemoteDisplay) { + for(const auto& id : state.getIviIdList()) + { + HMI_DEBUG("Add remote %d", id); + ivi_remote_l_ids.push_back(id); + } + } } // Create render order @@ -230,12 +260,31 @@ WMError LayerControl::renderLayers() int count = 0; for(const auto& i : ivi_l_ids) { - id_array[count] = i; - ++count; + id_array[count++] = i; + } + + t_ilm_layer* remote_id_array = nullptr; + if(haveRemoteDisplay && ivi_remote_l_ids.size() != 0) { + remote_id_array = new t_ilm_layer[ivi_remote_l_ids.size()]; + if(remote_id_array == nullptr) + { + HMI_WARNING("short memory"); + this->undoUpdate(); + return WMError::FAIL; + } + count = 0; + for(const auto& i : ivi_remote_l_ids) + { + remote_id_array[count++] = i; + } } // Display ilmErrorTypes ret = ilm_displaySetRenderOrder(this->screenID, id_array, ivi_l_ids.size()); + if(ret == ILM_SUCCESS && haveRemoteDisplay) + { + ret = ilm_displaySetRenderOrder(this->remoteScreenID, remote_id_array, ivi_remote_l_ids.size()); + } if(ret != ILM_SUCCESS) { this->undoUpdate(); @@ -250,6 +299,7 @@ WMError LayerControl::renderLayers() } ilm_commitChanges(); delete id_array; + delete remote_id_array; return rc; } @@ -604,11 +654,18 @@ WMError LayerControl::makeVisible(const shared_ptr client) { WMError ret = WMError::SUCCESS; // Don't check here wheher client is nullptr or not - unsigned layer = client->layerID(); + unsigned layer_id = client->layerID(); + auto layer = getWMLayer(layer_id); - this->moveForeGround(client); + if (!layer->isRemote()) + { + this->moveForeGround(client); + } + else if (0 > this->remoteScreenID) { + return ret; + } - ilm_layerSetVisibility(layer, ILM_TRUE); + ilm_layerSetVisibility(layer_id, ILM_TRUE); return ret; } @@ -617,14 +674,28 @@ WMError LayerControl::makeInvisible(const shared_ptr client) { WMError ret = WMError::SUCCESS; // Don't check here the client is not nullptr - unsigned layer = client->layerID(); + unsigned layer_id = client->layerID(); + auto layer = getWMLayer(layer_id); - bool mv_ok = this->moveBackGround(client); + bool set_invisible = true; + if (!layer->isRemote()) + { + if(this->moveBackGround(client)) + { + set_invisible = false; + } + else + { + HMI_INFO("make invisible client %s", client->appID().c_str()); + } + } + else if (0 > this->remoteScreenID) { + return ret; + } - if(!mv_ok) + if (set_invisible) { - HMI_INFO("make invisible client %s", client->appID().c_str()); - ilm_layerSetVisibility(layer, ILM_FALSE); + ilm_layerSetVisibility(layer_id, ILM_FALSE); } return ret;