aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorScott Murray <scott.murray@konsulko.com>2019-10-20 12:27:29 -0400
committerScott Murray <scott.murray@konsulko.com>2019-10-20 13:37:52 -0400
commitd6b295b89882b61ddefc4bed4b6f8dad0181d170 (patch)
tree00c4a6c74a0d7c7062d390b416509fa73ca47570 /src
parent8501d1f32139212ad1b26eaf08dabf42edab9c9a (diff)
Apply a heavily refactored version of the remote display changes from the CES 2019 demo #3 source demo3/common/agl-service-windowmanager in: https://git.automotivelinux.org/staging/new-apps The refactoring of the extracted changes has been done with an eye to reduce code duplication and minimize the changes to existing code. As well, the required default policy manager changes missing in the demo #3 tree have been added to produce a working default policy. At present the configuration has been hard-coded to assume use of the tbtnavi application on a Weston remoting display, but testing has also been done with a second display on one board. The changes should not impact operation of any other application, as only applications with roles listed in the "Remote" layer definition can be displayed on a configured second Weston screen. Bug-AGL: SPEC-2914 Signed-off-by: Scott Murray <scott.murray@konsulko.com> Change-Id: I29380bbbec46969b75ed4fe7e8095db772524082
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