+bool LayerControl::moveRemote(unsigned layer, const std::string& area)
+{
+ bool ret = false;
+ std::string remote_layer = this->areaToRemoteLayer(area);
+ auto remote = this->getWMLayer(remote_layer);
+
+ if(remote != nullptr)
+ {
+ ret = true;
+ if(remote->hasLayerID(layer))
+ {
+ HMI_DEBUG("Already moved layer %d", layer);
+ remote->dump();
+ return ret;
+ }
+
+ shared_ptr<WMLayer> wm_layer;
+ std::string wm_layer_name = this->hasRemoteLayer(layer);
+
+ if(wm_layer_name == "")
+ {
+ wm_layer = this->getWMLayer(layer);
+ }
+ else
+ {
+ wm_layer = this->getWMLayer(wm_layer_name);
+ }
+
+ remote->addLayerToState(layer);
+ wm_layer->removeLayerFromState(layer);
+ wm_layer->dump();
+ remote->dump();
+ }
+
+ return ret;
+}
+
+bool LayerControl::moveLocal(unsigned layer)
+{
+ bool ret = false;
+ std::string remote_layer;
+
+ remote_layer = this->hasRemoteLayer(layer);
+
+ auto remote = this->getWMLayer(remote_layer);
+ if(remote != nullptr)
+ {
+ remote->removeLayerFromState(layer);
+ auto wm_layer = this->getWMLayer(layer);
+ wm_layer->addLayerToState(layer);
+ wm_layer->dump();
+ remote->dump();
+ ret = true;
+ }
+
+ return ret;
+}
+
+std::string LayerControl::hasRemoteLayer(unsigned layer)
+{
+ for (auto itr = wm_remoteLayerName.begin(); itr != wm_remoteLayerName.end(); ++itr)
+ {
+ auto remote = this->getWMLayer(*itr);
+ if(remote != nullptr)
+ {
+ if(remote->hasLayerFromState(layer))
+ {
+ return *itr;
+ }
+ }
+ }
+
+ return "";
+}
+
+std::string LayerControl::areaToRemoteLayer(const std::string& area)
+{
+ std::vector<std::string> elements;
+
+ if (area.find('.') != std::string::npos)
+ {
+ elements = parseString(area, '.');
+ }
+ else
+ {
+ elements.push_back(area);
+ }
+
+ for (auto itr = wm_remoteLayerName.begin(); itr != wm_remoteLayerName.end(); ++itr)
+ {
+ unsigned int idx = 0;
+ for (auto itr_elem = elements.begin(); itr_elem != elements.end(); ++itr_elem)
+ {
+ if (std::regex_search(*itr, std::regex(*itr_elem, std::regex::icase)))
+ {
+ if (++idx == elements.size())
+ {
+ return *itr;
+ }
+ }
+ else
+ {
+ // TODO: workaround, skip normal case
+ if ((itr_elem->compare("normal") == 0) || (itr_elem->compare("full") == 0))
+ {
+ if (++idx == elements.size())
+ {
+ return *itr;
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ }
+
+ return wm_remoteLayerName[0];
+}
+} // namespace wm