diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/window_manager.cpp | 9 | ||||
-rw-r--r-- | src/wm_layer.hpp | 4 | ||||
-rw-r--r-- | src/wm_layer_control.cpp | 109 | ||||
-rw-r--r-- | src/wm_layer_control.hpp | 8 |
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 |