From 8c455d3019d238494dbae5b5ec876e24ee5d616e Mon Sep 17 00:00:00 2001 From: Kazumasa Mitsunari Date: Mon, 4 Feb 2019 17:30:56 +0900 Subject: Change active/inactive state spec "active" state means "visible" on source code currently. Specification in HMI-FW spec 0.9.2 says it's not visible. https://wiki.automotivelinux.org/hmiframework It's the right to have resources such as buffers(surface). But from the view point of implementation of windowmanager-service, it is difficult to control resources of application. So this patch fixes just adding the methods to change the state of client. v2. emit active/inactive when state is changed. Change-Id: If445af3cdf724827ccf28f40af28cca4a2ffcbc1 Signed-off-by: Kazumasa Mitsunari --- src/window_manager.cpp | 15 ++++++++++----- src/wm_client.cpp | 18 ++++++++++++++++++ src/wm_client.hpp | 4 ++++ 3 files changed, 32 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/window_manager.cpp b/src/window_manager.cpp index abd4552..c7b6741 100644 --- a/src/window_manager.cpp +++ b/src/window_manager.cpp @@ -265,10 +265,11 @@ void WindowManager::api_activate_window(char const *appid, char const *drawing_n if(!g_app_list.contains(id)) { - reply("app doesn't request 'requestSurface' or 'setRole' yet"); + reply("app doesn't request 'requestSurface' yet"); return; } auto client = g_app_list.lookUpClient(id); + client->activate(); Task task = Task::TASK_ALLOCATE; unsigned req_num = 0; @@ -306,8 +307,15 @@ void WindowManager::api_activate_window(char const *appid, char const *drawing_n void WindowManager::api_deactivate_window(char const *appid, char const *drawing_name, const reply_func &reply) { - // Check Phase string id = appid; + if(!g_app_list.contains(id)) + { + reply("app doesn't request 'requestSurface' yet"); + return; + } + auto client = g_app_list.lookUpClient(id); + client->deactivate(); + // Check Phase string role = drawing_name; string area = ""; //drawing_area; Task task = Task::TASK_RELEASE; @@ -804,7 +812,6 @@ WMError WindowManager::startTransition(unsigned req_num) for (const auto &x : actions) { this->lc->visibilityChange(x); - x.client->emitActive(false); x.client->emitVisible(false); } this->lc->renderLayers(); @@ -841,8 +848,6 @@ WMError WindowManager::doEndDraw(unsigned req_num) return ret; } ret = this->lc->visibilityChange(act); - - act.client->emitActive((act.visible == VISIBLE)); act.client->emitVisible((act.visible == VISIBLE)); if (ret != WMError::SUCCESS) diff --git a/src/wm_client.cpp b/src/wm_client.cpp index ff08a00..d3f0364 100644 --- a/src/wm_client.cpp +++ b/src/wm_client.cpp @@ -72,6 +72,8 @@ WMClient::WMClient(const string &appid, const string &role) : id(appid), layer(0), is_source_set(false), + is_active(false), + main_role(role), role2surface(0), evname2afb_event(0) { @@ -90,6 +92,8 @@ WMClient::WMClient(const string &appid, const string &role) WMClient::WMClient(const string &appid, unsigned layer, const string &role) : id(appid), layer(layer), + is_source_set(false), + is_active(false), main_role(role), role2surface(0), evname2afb_event(0) @@ -131,6 +135,20 @@ void WMClient::registerSurface(unsigned surface) this->surface = surface; } +void WMClient::activate() +{ + if(!this->isActive()) + this->emitActive(true); // emit when state is changed + this->is_active = true; +} + +void WMClient::deactivate() +{ + if(this->isActive()) + this->emitActive(false); // emit when state is changed + this->is_active = false; +} + /** * Add surface to the client * diff --git a/src/wm_client.hpp b/src/wm_client.hpp index 3ffa786..17d2221 100644 --- a/src/wm_client.hpp +++ b/src/wm_client.hpp @@ -48,11 +48,14 @@ class WMClient unsigned layerID() const; unsigned surfaceID() const; void registerSurface(unsigned surface); + void activate(); + void deactivate(); std::string area() const {return this->app_area;}; void setArea(const std::string area) {this->app_area = area;} WMError addSurface(unsigned surface); bool isSourceSizeSet(); void setSurfaceSizeCorrectly(); + bool isActive() { return this->is_active;} bool removeSurfaceIfExist(unsigned surface); bool subscribe(afb_req_t req, const std::string &event_name); @@ -68,6 +71,7 @@ class WMClient std::string id; unsigned layer; bool is_source_set; + bool is_active; std::string main_role; std::string app_area; unsigned surface; // currently, main application has only one surface. -- cgit 1.2.3-korg