/* * Copyright (c) 2017 TOYOTA MOTOR CORPORATION * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include "wm_error.hpp" #include "util.hpp" namespace wm { class Screen { public: Screen(unsigned id, unsigned w, unsigned h) : _screen_id(id), _width(w), _height(h){} unsigned width() const { return _width; } unsigned height() const { return _height; } unsigned id() const { return _screen_id; } unsigned scale() const { return _scale; } int offsetX() const { return _offset_x; } int offsetY() const { return _offset_y; } void setScale(double scl) { this->_scale = scl; } void setOffset(int x, int y) { this->_offset_x = x; this->_offset_y = y; } private: unsigned _screen_id; unsigned _width; unsigned _height; unsigned _pysical_width = 0; unsigned _pysical_height = 0; int _offset_x = 0; int _offset_y = 0; double _scale = 1.0; }; class LayerControlCallbacks { public: LayerControlCallbacks() {}; ~LayerControlCallbacks() = default; LayerControlCallbacks(const LayerControlCallbacks &obj) = default; // callback functions std::function surfaceCreated; std::function surfaceDestroyed; /* std::function layerCreated; std::function layerDestroyed; */ }; class WMLayer; class LayerState; class WMAction; class WMClient; class LayerControl { public: explicit LayerControl(const std::string& root, const std::string& ecu_name); ~LayerControl() = default; WMError init(const LayerControlCallbacks& cb); void createNewLayer(unsigned id); void createNewRemoteLayer(unsigned id); unsigned getNewLayerID(const std::string& role, std::string* layer_name); std::shared_ptr getWMLayer(unsigned layer); std::shared_ptr getWMLayer(std::string layer_name); struct rect getAreaSize(const std::string& area); void setupArea(const rectangle& base_rct, double scaling); Screen getScreenInfo(); double scale(); WMError updateLayer(LayerState& layer_state); WMError renderLayers(); // WMError renderLayersRemote(); WMError setXDGSurfaceOriginSize(unsigned surface); void undoUpdate(); WMError layoutChange(const WMAction& action); WMError visibilityChange(const WMAction &action); const std::unordered_map& getAreaList() {return this->area2size;} WMError updateAreaList(const ChangeAreaReq& req); WMError getUpdateAreaList(ChangeAreaReq* req); WMError changeAreaSize(std::shared_ptr client, const std::string& area); void appTerminated(const std::shared_ptr client); // Don't use this function. void dispatchCreateEvent(ilmObjectType object, unsigned id, bool created); void dispatchSurfacePropChangeEvent(unsigned id, struct ilmSurfaceProperties*, t_ilm_notification_mask); void dispatchLayerPropChangeEvent(unsigned id, struct ilmLayerProperties*, t_ilm_notification_mask); std::string hasRemoteLayer(unsigned layer); std::string areaToRemoteLayer(const std::string& area); private: WMError makeVisible(const std::shared_ptr client); WMError makeInvisible(const std::shared_ptr client); bool moveForeGround(const std::shared_ptr client); bool moveBackGround(const std::shared_ptr client); bool moveRemote(unsigned layer, const std::string& area); bool moveLocal(unsigned layer); int loadWestonSetting(const std::string &path); WMError loadLayerSetting(const std::string& path); WMError loadAreasConfigFile(const std::string& path, const std::string& ecu_name); std::vector> wm_layers; std::vector wm_remoteLayerName; std::vector wm_screens; std::unordered_map lid2wmlid; std::unordered_map area2size; unsigned screenID; double scaling; int offset_x; int offset_y; LayerControlCallbacks cb; long times; long sleep; }; } // namespace wm