aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/window_manager.cpp9
-rw-r--r--src/wm_layer.hpp4
-rw-r--r--src/wm_layer_control.cpp109
-rw-r--r--src/wm_layer_control.hpp8
4 files changed, 106 insertions, 24 deletions
diff --git a/src/window_manager.cpp b/src/window_manager.cpp
index f9070f6..dcaf636 100644
--- a/src/window_manager.cpp
+++ b/src/window_manager.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ * Copyright (c) 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.
@@ -713,7 +714,8 @@ void WindowManager::processError(WMError error)
unsigned WindowManager::generateLayerForClient(const string& role)
{
- unsigned lid = this->lc->getNewLayerID(role);
+ string l_name;
+ unsigned lid = this->lc->getNewLayerID(role, &l_name);
if (lid == 0)
{
// register drawing_name as fallback and make it displayed.
@@ -724,7 +726,10 @@ unsigned WindowManager::generateLayerForClient(const string& role)
return lid;
}
}
- this->lc->createNewLayer(lid);
+
+ // TODO: remote layer name is fixed
+ this->lc->createNewLayer(lid, ("Remote" == l_name));
+
// add client into the db
return lid;
}
diff --git a/src/wm_layer.hpp b/src/wm_layer.hpp
index 97cf8a8..1521309 100644
--- a/src/wm_layer.hpp
+++ b/src/wm_layer.hpp
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ * Copyright (c) 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.
@@ -65,6 +66,8 @@ class WMLayer
WMError setLayerState(const LayerState& l);
bool hasLayerID(unsigned id);
bool hasRole(const std::string& role);
+ void setRemote(const bool newRemote) { remote = newRemote; }
+ bool isRemote(void) { return remote; }
// Manipulation
void addLayerToState(unsigned layer);
@@ -90,6 +93,7 @@ class WMLayer
std::vector<unsigned> id_list;
unsigned id_begin;
unsigned id_end;
+ bool remote = false;
};
} // namespace wm
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;
diff --git a/src/wm_layer_control.hpp b/src/wm_layer_control.hpp
index 68acd66..e675e12 100644
--- a/src/wm_layer_control.hpp
+++ b/src/wm_layer_control.hpp
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ * Copyright (c) 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.
@@ -63,8 +64,8 @@ class LayerControl
explicit LayerControl(const std::string& root);
~LayerControl() = default;
WMError init(const LayerControlCallbacks& cb);
- void createNewLayer(unsigned id);
- unsigned getNewLayerID(const std::string& role);
+ void createNewLayer(unsigned id, bool remote = false);
+ unsigned getNewLayerID(const std::string& role, std::string* layer_name = nullptr);
std::shared_ptr<WMLayer> getWMLayer(unsigned layer);
std::shared_ptr<WMLayer> getWMLayer(std::string layer_name);
struct rect getAreaSize(const std::string& area);
@@ -99,6 +100,7 @@ class LayerControl
std::unordered_map<unsigned, unsigned> lid2wmlid;
std::unordered_map<std::string, struct rect> area2size;
unsigned screenID;
+ signed remoteScreenID;
struct ilmScreenProperties screen_prop;
double scaling;
int offset_x;
@@ -106,4 +108,4 @@ class LayerControl
LayerControlCallbacks cb;
};
-} // namespace wm \ No newline at end of file
+} // namespace wm