aboutsummaryrefslogtreecommitdiffstats
path: root/src/wm_layer_control.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/wm_layer_control.cpp')
-rw-r--r--src/wm_layer_control.cpp109
1 files changed, 90 insertions, 19 deletions
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<unsigned> ivi_l_ids;
+ vector<unsigned> 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<WMClient> 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<WMClient> 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;