From 8558bda51548cde1f9e7d46526bdbcc2475fe8e6 Mon Sep 17 00:00:00 2001 From: Kazumasa Mitsunari Date: Wed, 14 Nov 2018 20:09:46 +0900 Subject: Improve window manager * Make sure there is no difference from the main line's line as much as possible * Fix timing issue of launcher and homescreen Change-Id: I39da579d62927278c308d56d53eed005b4284715 Signed-off-by: Kazumasa Mitsunari --- layers.json | 104 ++++++++++++++----------- package/root/config.xml | 4 +- src/CMakeLists.txt | 4 +- src/applist.cpp | 83 -------------------- src/applist.hpp | 17 ----- src/main.cpp | 137 ++------------------------------- src/util.hpp | 2 +- src/window_manager.cpp | 193 +++++++++++++++++++++++++++-------------------- src/window_manager.hpp | 52 ++++--------- src/wm_layer.cpp | 15 ++-- src/wm_layer.hpp | 22 ++---- src/wm_layer_control.cpp | 68 +++++------------ src/wm_layer_control.hpp | 14 ++-- 13 files changed, 237 insertions(+), 478 deletions(-) diff --git a/layers.json b/layers.json index fddd258..d82d2ea 100644 --- a/layers.json +++ b/layers.json @@ -1,47 +1,61 @@ { - "comment": "Surface ID to Layer ID mapping", - - "main_surface": { - "surface_role": "HomeScreen", - "comment": "This surface should never be made invisible (The HomeScreen)" - }, - - "mappings": [ - { - "role": "BackGroundLayer", - "name": "BackGroundLayer", - "layer_id": 999, - "comment": "Single BackGround layer map for the map, radio, music and video" - }, - { - "role": "homescreen", - "name": "FarHomeScreen", - "layer_id": 1000, - "comment": "FarHomeScreen is the part of HomeScreen. The z order of this layer is lower than NearHomeScreen" - }, - { - "role": "music|video|browser|radio|phone|map|hvac|settings|dashboard|poi|mixer|sdl|launcher|fallback", - "name": "Apps", - "layer_id": 1001, - "comment": "Range of IDs that will always be placed on layer 1001" - }, - { - "role": "software_keyboard", - "name": "NearHomeScreen", - "layer_id": 1002, - "comment": "NearHomeScreen is the part of HomeScreen. The z order of this layer is upper than FarHomeScreen" - }, - { - "role": "restriction", - "name": "Restriction", - "layer_id": 1003, - "comment": "This layer is for restriction notification. This is used by restriction role" - }, - { - "role": "^on_screen.*", - "name": "OnScreen", - "layer_id": 9999, - "comment": "Range of IDs that will always be placed on the OnScreen layer, that gets a very high 'dummy' id of 9999" - } - ] + "description": "Layer mapping", + "mappings": [ + { + "name": "BackGroundLayer", + "role" : "map|radio|music|video", + "id_range_begin": 0, + "id_range_end": 0, + "comment": "Work Around: This is evacuation layer that not stopping event loop" + }, + { + "name": "FarHomeScreen", + "role": "homescreen", + "id_range_begin": 100, + "id_range_end": 199, + "comment": "FarHomeScreen is the part of HomeScreen. The z order of this layer is lower than NearHomeScreen" + }, + { + "name": "Apps", + "role": "music|video|browser|radio|phone|map|navigation|hvac|settings|dashboard|poi|mixer|sdl|launcher|receiver|tachometer|fallback", + "id_range_begin": 1000, + "id_range_end": 2999, + "comment": "Range of IDs that will always be placed on layer 1001" + }, + { + "name": "NearHomeScreen", + "role": "", + "id_range_begin": 3000, + "id_range_end": 3000, + "comment": "TOYOTA special software keyboard" + }, + { + "name": "Application Popup Layer", + "role": "popup*", + "id_range_begin": 4000, + "id_range_end": 4999, + "comment": "[T.B.D]This layer is for application popup layer" + }, + { + "name": "Restriction", + "role": "restriction", + "id_range_begin": 5000, + "id_range_end": 5999, + "comment": "This layer is for restriction notification. This is used by restriction role" + }, + { + "name": "OnScreen", + "role": "^on_screen*", + "id_range_begin": 6000, + "id_range_end": 6999, + "comment": "Range of IDs that will always be placed on the OnScreen layer, that gets a very high 'dummy' id of 9999" + }, + { + "name": "Remote", + "role": "tbtnavi", + "id_range_begin": 9000, + "id_range_end": 9999, + "comment": "Range of IDs that will always be placed on the OnScreen layer, that gets a very high 'dummy' id of 9999" + } + ] } diff --git a/package/root/config.xml b/package/root/config.xml index e297b28..e11ef63 100644 --- a/package/root/config.xml +++ b/package/root/config.xml @@ -1,6 +1,6 @@ - - windowmanager-service-2017 + + windowmanager-service Window Manager TOYOTA diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9fa4b73..4b67d38 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -113,12 +113,12 @@ add_custom_command(TARGET ${TARGETS_WM} POST_BUILD COMMAND mkdir -p ${PROJECT_BINARY_DIR}/package/root/lib COMMAND cp -rf ${PROJECT_BINARY_DIR}/src/${TARGETS_WM}.so ${PROJECT_BINARY_DIR}/package/root/lib COMMAND mkdir -p ${PROJECT_BINARY_DIR}/package/root/etc - COMMAND cp -f ${PROJECT_SOURCE_DIR}/layers_setting.json ${PROJECT_BINARY_DIR}/package/root/etc + COMMAND cp -f ${PROJECT_SOURCE_DIR}/layers.json ${PROJECT_BINARY_DIR}/package/root/etc COMMAND cp -f ${PROJECT_SOURCE_DIR}/src/config/old_roles.json ${PROJECT_BINARY_DIR}/package/root/etc COMMAND cp -f ${PROJECT_SOURCE_DIR}/src/config/areas.json ${PROJECT_BINARY_DIR}/package/root/etc COMMAND cp -f ${PROJECT_SOURCE_DIR}/src/config/connection.json ${PROJECT_BINARY_DIR}/package/root/etc ) add_custom_target(package DEPENDS ${PROJECT_BINARY_DIR}/package/root - COMMAND wgtpkg-pack -f -o ${PROJECT_BINARY_DIR}/package/${TARGETS_WM}-2017.wgt ${PROJECT_BINARY_DIR}/package/root + COMMAND wgtpkg-pack -f -o ${PROJECT_BINARY_DIR}/package/${TARGETS_WM}.wgt ${PROJECT_BINARY_DIR}/package/root ) diff --git a/src/applist.cpp b/src/applist.cpp index 44865f6..be5fe57 100644 --- a/src/applist.cpp +++ b/src/applist.cpp @@ -169,24 +169,10 @@ int AppList::countClient() const * Returns AppID if found. * * @param unsigned[in] surfaceID - * @param string[in] role * @param bool[in,out] AppID is found or not * @return AppID * @attention If AppID is not found, param found will be false. */ -/* string AppList::getAppID(unsigned surface, const string& role, bool* found) const -{ - *found = false; - for (const auto &x : this->app2client) - { - if(x.second->surfaceID(role) == surface){ - *found = true; - return x.second->appID(); - } - } - return string(""); -} */ - string AppList::getAppID(unsigned surface, bool* found) const { *found = false; @@ -200,64 +186,6 @@ string AppList::getAppID(unsigned surface, bool* found) const return string(""); } -WMError AppList::popFloatingSurface(unsigned pid, unsigned *surface) -{ - WMError ret = WMError::NO_ENTRY; - - auto fwd_itr = std::remove_if(this->floating_surfaces.begin(), this->floating_surfaces.end(), - [pid, surface, &ret](FloatingSurface x) { - if(pid == x.pid){ - *surface = x.surface_id; - ret = WMError::SUCCESS; - return true; - } - else{ - return false; - } - }); - if (fwd_itr != this->floating_surfaces.cend()) - { - HMI_INFO("pop floating surface: %d", *surface); - } - this->floating_surfaces.erase(fwd_itr, this->floating_surfaces.end()); - return ret; -} - -// =================== Floating(Temporary) surface/client API =================== - -// TODO: After testing setRole, remove these API - -WMError AppList::popFloatingSurface(const string &appid, unsigned *surface) -{ - HMI_ERROR("This function is not implemented"); - return WMError::SUCCESS; -} - -void AppList::addFloatingClient(const string &appid, unsigned layer, const string &role) -{ -} - -void AppList::addFloatingSurface(const string &appid, unsigned surface, unsigned pid) -{ - struct FloatingSurface fsurface{appid, surface, pid}; - this->floating_surfaces.push_back(fsurface); - this->dumpFloatingSurfaces(); -} - -void AppList::removeFloatingSurface(unsigned surface) -{ - this->dumpFloatingSurfaces(); - auto fwd_itr = std::remove_if( - this->floating_surfaces.begin(), this->floating_surfaces.end(), - [surface](FloatingSurface x) { - return x.surface_id == surface; - }); - if(fwd_itr != this->floating_surfaces.cend()){ - HMI_INFO("remove floating surface: %d", surface); - } - this->floating_surfaces.erase(fwd_itr, this->floating_surfaces.end()); -} - // =================== Request Date container API =================== /** @@ -621,15 +549,4 @@ void AppList::reqDump() } DUMP("======= req dump end ====="); } - -void AppList::dumpFloatingSurfaces() -{ - DUMP("======= floating surface dump ====="); - for (const auto &x : this->floating_surfaces) - { - DUMP("surface : %d, pid : %d", x.surface_id, x.pid); - } - DUMP("======= floating surface dump end =====\n"); -} - } // namespace wm diff --git a/src/applist.hpp b/src/applist.hpp index 36e0524..085504a 100644 --- a/src/applist.hpp +++ b/src/applist.hpp @@ -31,13 +31,6 @@ namespace wm /* using std::experimental::nullopt; using std::experimental::optional; */ -struct FloatingSurface -{ - std::string appid; - unsigned surface_id; - unsigned pid; -}; - class AppList { public: @@ -59,14 +52,6 @@ class AppList void removeSurface(unsigned surface); std::string getAppID(unsigned surface, bool* found) const; // TODO: remove - - // Floating surface - void addFloatingClient(const std::string &appid, unsigned layer, const std::string &role); - void addFloatingSurface(const std::string &appid, unsigned surface, unsigned pid); - WMError popFloatingSurface(unsigned pid, unsigned *surface); - WMError popFloatingSurface(const std::string &appid, unsigned *surface); - void removeFloatingSurface(unsigned surface); - // Request Interface unsigned currentRequestNumber() const; unsigned getRequestNumber(const std::string &appid) const; @@ -85,14 +70,12 @@ class AppList void clientDump(); void reqDump(); - void dumpFloatingSurfaces(); private: std::vector req_list; std::unordered_map> app2client; unsigned current_req; std::mutex mtx; - std::vector floating_surfaces; }; } // namespace wm diff --git a/src/main.cpp b/src/main.cpp index 3766152..b62bb58 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -104,7 +104,7 @@ static void cbRemoveClientCtxt(void *data) // Policy Manager does not know this app was killed, // so notify it by deactivate request. - g_afb_instance->wmgr.api_deactivate_surface( + g_afb_instance->wmgr.api_deactivate_window( ctxt->name.c_str(), ctxt->role.c_str(), [](const char *) {}); @@ -129,7 +129,6 @@ static void createSecurityContext(afb_req req, const char* appid, const char* ro void windowmanager_requestsurface(afb_req req) noexcept { std::lock_guard guard(binding_m); - if (g_afb_instance == nullptr) { afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); @@ -150,7 +149,6 @@ void windowmanager_requestsurface(afb_req req) noexcept { auto ret = g_afb_instance->wmgr.api_request_surface( appid, a_drawing_name); - if (ret.is_err()) { afb_req_fail(req, "failed", ret.unwrap_err()); @@ -177,7 +175,6 @@ void windowmanager_requestsurface(afb_req req) noexcept void windowmanager_requestsurfacexdg(afb_req req) noexcept { std::lock_guard guard(binding_m); - if (g_afb_instance == nullptr) { afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); @@ -208,6 +205,7 @@ void windowmanager_requestsurfacexdg(afb_req req) noexcept { auto ret = g_afb_instance->wmgr.api_request_surface( appid, a_drawing_name, a_ivi_id); + if (ret != nullptr) { afb_req_fail(req, "failed", ret); @@ -273,7 +271,6 @@ void windowmanager_setrole(afb_req req) noexcept void windowmanager_activatewindow(afb_req req) noexcept { std::lock_guard guard(binding_m); - if (g_afb_instance == nullptr) { afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); @@ -312,7 +309,7 @@ void windowmanager_activatewindow(afb_req req) noexcept if (g_afb_instance->wmgr.wmcon.isMasterMode() || !g_afb_instance->wmgr.wmcon.isMasterArea(a_drawing_area)) { - g_afb_instance->wmgr.api_activate_surface( + g_afb_instance->wmgr.api_activate_window( appid, a_drawing_name, a_drawing_area, reply); } else @@ -342,7 +339,6 @@ void windowmanager_activatewindow(afb_req req) noexcept void windowmanager_deactivatewindow(afb_req req) noexcept { std::lock_guard guard(binding_m); - if (g_afb_instance == nullptr) { afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); @@ -375,7 +371,7 @@ void windowmanager_deactivatewindow(afb_req req) noexcept if (g_afb_instance->wmgr.wmcon.isMasterMode() || ("tbtnavi" != std::string(a_drawing_name))) { - g_afb_instance->wmgr.api_deactivate_surface( + g_afb_instance->wmgr.api_deactivate_window( appid, a_drawing_name, reply); } else @@ -399,7 +395,6 @@ void windowmanager_deactivatewindow(afb_req req) noexcept void windowmanager_enddraw(afb_req req) noexcept { std::lock_guard guard(binding_m); - if (g_afb_instance == nullptr) { afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); @@ -444,7 +439,6 @@ void windowmanager_enddraw(afb_req req) noexcept void windowmanager_getdisplayinfo_thunk(afb_req req) noexcept { std::lock_guard guard(binding_m); - if (g_afb_instance == nullptr) { afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); @@ -472,7 +466,6 @@ void windowmanager_getdisplayinfo_thunk(afb_req req) noexcept void windowmanager_getareainfo_thunk(afb_req req) noexcept { std::lock_guard guard(binding_m); - if (g_afb_instance == nullptr) { afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); @@ -628,7 +621,6 @@ void windowmanager_attach_app(afb_req req) noexcept void windowmanager_wm_subscribe(afb_req req) noexcept { std::lock_guard guard(binding_m); - if (g_afb_instance == nullptr) { afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); @@ -644,10 +636,9 @@ void windowmanager_wm_subscribe(afb_req req) noexcept afb_req_fail(req, "failed", "Need char const* argument event"); return; } - int event_type = json_object_get_int(j); - const char *event_name = g_afb_instance->wmgr.kListEventName[event_type]; - struct afb_event event = g_afb_instance->wmgr.map_afb_event[event_name]; - int ret = afb_req_subscribe(req, event); + int event_id = json_object_get_int(j); + int ret = g_afb_instance->wmgr.api_subscribe(req, event_id); + if (ret) { afb_req_fail(req, "failed", "Error: afb_req_subscribe()"); @@ -662,36 +653,6 @@ void windowmanager_wm_subscribe(afb_req req) noexcept } } -void windowmanager_list_drawing_names(afb_req req) noexcept -{ - std::lock_guard guard(binding_m); - - /* if (g_afb_instance == nullptr) - { - afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); - return; - } - - try - { - - nlohmann::json j = g_afb_instance->wmgr.id_alloc.name2id; - auto ret = wm::Ok(json_tokener_parse(j.dump().c_str())); - if (ret.is_err()) - { - afb_req_fail(req, "failed", ret.unwrap_err()); - return; - } - - afb_req_success(req, ret.unwrap(), "success"); - } - catch (std::exception &e) - { - afb_req_fail_f(req, "failed", "Uncaught exception while calling list_drawing_names: %s", e.what()); - return; - } */ -} - void windowmanager_ping(afb_req req) noexcept { std::lock_guard guard(binding_m); @@ -707,89 +668,9 @@ void windowmanager_ping(afb_req req) noexcept } } -void windowmanager_debug_status(afb_req req) noexcept -{ - std::lock_guard guard(binding_m); - - /* if (g_afb_instance == nullptr) - { - afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); - return; - } - - try - { - - json_object *jr = json_object_new_object(); - json_object_object_add(jr, "surfaces", - to_json(g_afb_instance->wmgr.controller->sprops)); - json_object_object_add(jr, "layers", to_json(g_afb_instance->wmgr.controller->lprops)); - - afb_req_success(req, jr, "success"); - } - catch (std::exception &e) - { - afb_req_fail_f(req, "failed", "Uncaught exception while calling debug_status: %s", e.what()); - return; - } */ -} - -void windowmanager_debug_layers(afb_req req) noexcept -{ - std::lock_guard guard(binding_m); - - /* if (g_afb_instance == nullptr) - { - afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); - return; - } - - try - { - auto ret = wm::Ok(json_tokener_parse(g_afb_instance->wmgr.layers.to_json().dump().c_str())); - - afb_req_success(req, ret, "success"); - } - catch (std::exception &e) - { - afb_req_fail_f(req, "failed", "Uncaught exception while calling debug_layers: %s", e.what()); - return; - } */ -} - -void windowmanager_debug_surfaces(afb_req req) noexcept -{ - std::lock_guard guard(binding_m); - - /* if (g_afb_instance == nullptr) - { - afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); - return; - } - - try - { - - auto ret = wm::Ok(to_json(g_afb_instance->wmgr.controller->sprops)); - if (ret.is_err()) - { - afb_req_fail(req, "failed", ret.unwrap_err()); - return; - } - - afb_req_success(req, ret.unwrap(), "success"); - } - catch (std::exception &e) - { - afb_req_fail_f(req, "failed", "Uncaught exception while calling debug_surfaces: %s", e.what()); - return; - } */ -} - void windowmanager_debug_terminate(afb_req req) noexcept { std::lock_guard guard(binding_m); - if (g_afb_instance == nullptr) { afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); @@ -832,11 +713,7 @@ const struct afb_verb_v2 windowmanager_verbs[] = { {"setRenderOrder", windowmanager_set_render_order, nullptr, nullptr, AFB_SESSION_NONE}, {"attachApp", windowmanager_attach_app, nullptr, nullptr, AFB_SESSION_NONE}, {"wm_subscribe", windowmanager_wm_subscribe, nullptr, nullptr, AFB_SESSION_NONE}, - {"list_drawing_names", windowmanager_list_drawing_names, nullptr, nullptr, AFB_SESSION_NONE}, {"ping", windowmanager_ping, nullptr, nullptr, AFB_SESSION_NONE}, - {"debug_status", windowmanager_debug_status, nullptr, nullptr, AFB_SESSION_NONE}, - {"debug_layers", windowmanager_debug_layers, nullptr, nullptr, AFB_SESSION_NONE}, - {"debug_surfaces", windowmanager_debug_surfaces, nullptr, nullptr, AFB_SESSION_NONE}, {"debug_terminate", windowmanager_debug_terminate, nullptr, nullptr, AFB_SESSION_NONE}, {}}; diff --git a/src/util.hpp b/src/util.hpp index d049fff..57eaf81 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -38,7 +38,7 @@ #define HMI_SEQ_INFO(seq_num, args,...) _HMI_SEQ_LOG(LOG_LEVEL_INFO, __FILENAME__, __FUNCTION__, __LINE__, seq_num, args, ##__VA_ARGS__) #define HMI_SEQ_DEBUG(seq_num, args,...) _HMI_SEQ_LOG(LOG_LEVEL_DEBUG, __FILENAME__, __FUNCTION__, __LINE__, seq_num, args, ##__VA_ARGS__) -#define DUMP(args, ...) _DUMP(LOG_LEVEL_DEBUG, args, ##__VA_ARGS__) +#define DUMP(args, ...) _DUMP(LOG_LEVEL_INFO, args, ##__VA_ARGS__) enum LOG_LEVEL{ LOG_LEVEL_NONE = 0, diff --git a/src/window_manager.cpp b/src/window_manager.cpp index f209f12..cdf57c2 100644 --- a/src/window_manager.cpp +++ b/src/window_manager.cpp @@ -57,8 +57,25 @@ const char kKeyHeightMm[] = "height_mm"; const char kKeyScale[] = "scale"; const char kKeyIds[] = "ids"; -static const char kPathOldRolesConfigFile[] = "/etc/old_roles.json"; +static const vector kListEventName{ + "active", + "inactive", + "visible", + "invisible", + "syncDraw", + "flushDraw", + "screenUpdated", + "headlampOff", + "headlampOn", + "parkingBrakeOff", + "parkingBrakeOn", + "lightstatusBrakeOff", + "lightstatusBrakeOn", + "carStop", + "carRun", + "error"}; +static const char kPathOldRolesConfigFile[] = "/etc/old_roles.json"; static sd_event_source *g_timer_ev_src = nullptr; static AppList g_app_list; static WindowManager *g_context; @@ -159,7 +176,7 @@ int WindowManager::init() // Make afb event for (int i = Event_Val_Min; i <= Event_Val_Max; i++) { - map_afb_event[kListEventName[i]] = afb_daemon_make_event(kListEventName[i]); + map_afb_event[kListEventName[i]] = afb_daemon_make_event(kListEventName[i].c_str()); } const struct rect css_bg = this->lc->getAreaSize("fullscreen"); @@ -189,13 +206,10 @@ result WindowManager::api_request_surface(char const *appid, char const *dr if(!g_app_list.contains(s_appid)) { - // auto lid = this->layers.get_layer_id(string(role)); unsigned l_id = this->lc->getNewLayerID(s_role, &l_name); if (l_id == 0) { - /** - * register drawing_name as fallback and make it displayed. - */ + // register drawing_name as fallback and make it displayed. l_id = this->lc->getNewLayerID("fallback", &l_name); HMI_DEBUG("%s is not registered in layers.json, then fallback as normal app", role); if (l_id == 0) @@ -415,7 +429,7 @@ bool WindowManager::api_set_role(char const *appid, char const *drawing_name) return true; } -void WindowManager::api_activate_surface(char const *appid, char const *drawing_name, +void WindowManager::api_activate_window(char const *appid, char const *drawing_name, char const *drawing_area, const reply_func &reply) { // TODO: application requests by old role, @@ -608,7 +622,7 @@ void WindowManager::api_activate_surface_to_master( this->setTimer(); } -void WindowManager::api_deactivate_surface(char const *appid, char const *drawing_name, +void WindowManager::api_deactivate_window(char const *appid, char const *drawing_name, const reply_func &reply) { // TODO: application requests by old role, @@ -799,6 +813,12 @@ void WindowManager::api_enddraw(char const *appid, char const *drawing_name) } } +int WindowManager::api_subscribe(afb_req req, int event_id) +{ + struct afb_event event = this->map_afb_event[kListEventName[event_id]]; + return afb_req_subscribe(req, event); +} + void WindowManager::api_enddraw_for_remote(char const *appid, char const *drawing_name) { int ret = this->wmcon.sendRequest("endDraw", appid, drawing_name, ""); @@ -870,7 +890,7 @@ result WindowManager::api_get_area_info(char const *drawing_name) const char *role = this->convertRoleOldToNew(drawing_name); // Check drawing name, surface/layer id - auto const &surface_id = this->id_alloc.lookup(string(role)); + auto const &surface_id = this->id_alloc.lookup(role); if (!surface_id) { return Err("Surface does not exist"); @@ -927,9 +947,9 @@ result WindowManager::api_get_car_info(char const *label) return Ok(j_out); } -void WindowManager::send_event(char const *evname) +void WindowManager::send_event(const string& evname) { - HMI_DEBUG("%s: %s", __func__, evname); + HMI_DEBUG("%s: %s", __func__, evname.c_str()); int ret = afb_event_push(this->map_afb_event[evname], nullptr); if (ret != 0) @@ -938,12 +958,12 @@ void WindowManager::send_event(char const *evname) } } -void WindowManager::send_event(char const *evname, char const *label) +void WindowManager::send_event(const string& evname, const string& role) { - HMI_DEBUG("%s: %s(%s)", __func__, evname, label); + HMI_DEBUG("%s: %s(%s)", __func__, evname.c_str(), role.c_str()); json_object *j = json_object_new_object(); - json_object_object_add(j, kKeyDrawingName, json_object_new_string(label)); + json_object_object_add(j, kKeyDrawingName, json_object_new_string(role.c_str())); int ret = afb_event_push(this->map_afb_event[evname], j); if (ret != 0) @@ -952,11 +972,11 @@ void WindowManager::send_event(char const *evname, char const *label) } } -void WindowManager::send_event(char const *evname, char const *label, char const *area, +void WindowManager::send_event(const string& evname, const string& role, const string& area, int x, int y, int w, int h) { HMI_DEBUG("%s: %s(%s, %s) x:%d y:%d w:%d h:%d", - __func__, evname, label, area, x, y, w, h); + __func__, evname.c_str(), role.c_str(), area.c_str(), x, y, w, h); json_object *j_rect = json_object_new_object(); json_object_object_add(j_rect, kKeyX, json_object_new_int(x)); @@ -965,8 +985,8 @@ void WindowManager::send_event(char const *evname, char const *label, char const json_object_object_add(j_rect, kKeyHeight, json_object_new_int(h)); json_object *j = json_object_new_object(); - json_object_object_add(j, kKeyDrawingName, json_object_new_string(label)); - json_object_object_add(j, kKeyDrawingArea, json_object_new_string(area)); + json_object_object_add(j, kKeyDrawingName, json_object_new_string(role.c_str())); + json_object_object_add(j, kKeyDrawingArea, json_object_new_string(area.c_str())); json_object_object_add(j, kKeyDrawingRect, j_rect); int ret = afb_event_push(this->map_afb_event[evname], j); @@ -1116,7 +1136,6 @@ void WindowManager::surface_removed(unsigned surface_id) { HMI_DEBUG("Delete surface_id %u", surface_id); this->id_alloc.remove_id(surface_id); - // this->layers.remove_surface(surface_id); g_app_list.removeSurface(surface_id); } @@ -1124,7 +1143,7 @@ void WindowManager::removeClient(const string &appid) { HMI_DEBUG("Remove clinet %s from list", appid.c_str()); auto client = g_app_list.lookUpClient(appid); - this->lc->terminateApp(client); + this->lc->appTerminated(client); g_app_list.removeClient(appid); } @@ -1227,7 +1246,7 @@ void WindowManager::startTransitionWrapper(vector &actions) continue; } - std::string appid = g_app_list.getAppID(*surface_id, &found); + string appid = g_app_list.getAppID(*surface_id, &found); if (!found) { if (TaskVisible::INVISIBLE == act.visible) @@ -1316,6 +1335,9 @@ void WindowManager::processForRemoteRequest(json_object *data) const char *appid = jh::getStringFromJson(data, "appid"); const char *drawing_name = jh::getStringFromJson(data, "drawing_name"); const char *drawing_area = jh::getStringFromJson(data, "drawing_area"); + string request = req; + string role = drawing_name; + string area = drawing_area; if (!req || !drawing_name) { @@ -1339,7 +1361,7 @@ void WindowManager::processForRemoteRequest(json_object *data) } }; - if ("activateWindow" == std::string(req)) + if ("activateWindow" == request) { if (!drawing_area) { @@ -1350,19 +1372,19 @@ void WindowManager::processForRemoteRequest(json_object *data) this->api_activate_surface_for_slave( appid, drawing_name, drawing_area, reply); } - else if ("deactivateWindow" == std::string(req)) + else if ("deactivateWindow" == request) { this->api_deactivate_surface_for_slave( appid, drawing_name, reply); } - else if ("endDraw" == std::string(req)) + else if ("endDraw" == request) { this->api_enddraw(appid, drawing_name); } } else { - if ("syncDraw" == std::string(req)) + if ("syncDraw" == request) { this->stopTimer(); @@ -1386,7 +1408,7 @@ void WindowManager::processForRemoteRequest(json_object *data) req_num, client, string(c_role), - string(drawing_area), + area, TaskVisible::REMOTE_VISIBLE, end_draw_finished, TaskCarState::NO_TASK @@ -1400,16 +1422,16 @@ void WindowManager::processForRemoteRequest(json_object *data) return; } - this->emit_syncdraw(string(drawing_name), string(drawing_area)); + this->emit_syncdraw(role, area); this->wmcon.startSyncDrawForRemote(appid); this->setTimer(); } - else if ("activated" == std::string(req)) + else if ("activated" == request) { - this->emit_visible(drawing_name); - this->emit_activated(drawing_name); + this->emit_visible(role); + this->emit_activated(area); } - else if ("deactivated" == std::string(req)) + else if ("deactivated" == request) { this->stopTimer(); @@ -1443,16 +1465,16 @@ void WindowManager::processForRemoteRequest(json_object *data) this->lc->renderLayers(); this->lc->renderLayersRemote(); - this->emit_invisible(drawing_name); - this->emit_deactivated(drawing_name); + this->emit_invisible(role); + this->emit_deactivated(role); this->emitScreenUpdated(req_num); g_app_list.removeRequest(req_num); this->processNextRequest(); } - else if ("flushDraw" == std::string(req)) + else if ("flushDraw" == request) { - this->emit_flushdraw(drawing_name); + this->emit_flushdraw(role); } } } @@ -1461,44 +1483,44 @@ void WindowManager::processForRemoteRequest(json_object *data) ******* Private Functions ******* */ -void WindowManager::emit_activated(char const *label) +void WindowManager::emit_activated(const string& role) { - this->send_event(kListEventName[Event_Active], label); + this->send_event(kListEventName[Event_Active], role); } -void WindowManager::emit_deactivated(char const *label) +void WindowManager::emit_deactivated(const string& role) { - this->send_event(kListEventName[Event_Inactive], label); + this->send_event(kListEventName[Event_Inactive], role); } -void WindowManager::emit_syncdraw(char const *label, char const *area, int x, int y, int w, int h) +void WindowManager::emit_syncdraw(const string& role, char const *area, int x, int y, int w, int h) { - this->send_event(kListEventName[Event_SyncDraw], label, area, x, y, w, h); + this->send_event(kListEventName[Event_SyncDraw], role, area, x, y, w, h); } void WindowManager::emit_syncdraw(const string &role, const string &area) { - rect rect = this->lc->getAreaSize(area); + struct rect rect = this->lc->getAreaSize(area); this->send_event(kListEventName[Event_SyncDraw], - role.c_str(), area.c_str(), rect.x, rect.y, rect.w, rect.h); + role.c_str(), area.c_str(), rect.x, rect.y, rect.w, rect.h); } -void WindowManager::emit_flushdraw(char const *label) +void WindowManager::emit_flushdraw(const string& role) { - this->send_event(kListEventName[Event_FlushDraw], label); + this->send_event(kListEventName[Event_FlushDraw], role); } -void WindowManager::emit_visible(char const *label, bool is_visible) +void WindowManager::emit_visible(const string& role, bool is_visible) { - this->send_event(is_visible ? kListEventName[Event_Visible] : kListEventName[Event_Invisible], label); + this->send_event(is_visible ? kListEventName[Event_Visible] : kListEventName[Event_Invisible], role); } -void WindowManager::emit_invisible(char const *label) +void WindowManager::emit_invisible(const string& role) { - return emit_visible(label, false); + return emit_visible(role, false); } -void WindowManager::emit_visible(char const *label) { return emit_visible(label, true); } +void WindowManager::emit_visible(const string& role) { return emit_visible(role, true); } void WindowManager::emitHeadlampOff() { @@ -1764,7 +1786,7 @@ WMError WindowManager::startTransition(unsigned req_num) if (x.visible == TaskVisible::INVISIBLE) { - emit_deactivated(old_role.c_str()); + emit_deactivated(old_role); } else if (x.visible == TaskVisible::REQ_REMOTE_INVISIBLE) { @@ -1846,6 +1868,7 @@ WMError WindowManager::doEndDraw(unsigned req_num) { // get actions bool found; + bool trigger_homescreen = false; auto actions = g_app_list.getActions(req_num, &found); WMError ret = WMError::SUCCESS; if (!found) @@ -1853,6 +1876,13 @@ WMError WindowManager::doEndDraw(unsigned req_num) ret = WMError::NO_ENTRY; return ret; } + auto trigger = g_app_list.getRequest(req_num, &found); + HMI_SEQ_INFO(req_num, "trigger.role = %s", trigger.role.c_str()); + + if(trigger.role == "homescreen") + { + trigger_homescreen = true; + } HMI_SEQ_INFO(req_num, "do endDraw"); @@ -1869,42 +1899,45 @@ WMError WindowManager::doEndDraw(unsigned req_num) "Failed to manipulate surfaces while state change : %s", errorDescription(ret)); return ret; } - ret = this->lc->visibilityChange(act); - // Emit active/deactive event - string old_role = this->rolenew2old[act.role]; - if(act.visible == TaskVisible::VISIBLE) + if(trigger_homescreen && (act.visible == TaskVisible::INVISIBLE)) { - emit_visible(old_role.c_str()); - emit_activated(old_role.c_str()); + HMI_SEQ_NOTICE(req_num, "don't change visible if homescreen role is trigger"); } - else if(act.visible == TaskVisible::REQ_REMOTE_VISIBLE) + else { - // If this action is for slave, send to slave - int i_ret = this->wmcon.sendRequest("activated", "", old_role.c_str(), ""); - if (0 > i_ret) - { - ret = WMError::FAIL; - } + ret = this->lc->visibilityChange(act); } - else if(act.visible == TaskVisible::REQ_REMOTE_INVISIBLE) + + // Emit active/deactive event + string old_role = this->rolenew2old[act.role]; + switch(act.visible) { - // If this action is for slave, send to slave - int i_ret = this->wmcon.sendRequest("deactivated", "", old_role.c_str(), ""); - if (0 > i_ret) + case TaskVisible::VISIBLE : + emit_visible(old_role); + emit_activated(old_role); + break; + case TaskVisible::REQ_REMOTE_VISIBLE : { - ret = WMError::FAIL; + // If this action is for slave, send to slave + int i_ret = this->wmcon.sendRequest("activated", "", old_role.c_str(), ""); + if (0 > i_ret) + { + ret = WMError::FAIL; + } + break; } - } - else if((act.visible == TaskVisible::REMOTE_VISIBLE) || - (act.visible == TaskVisible::REMOTE_INVISIBLE)) - { - // nop because emit active/deactive by event from remote - } - else - { - emit_invisible(old_role.c_str()); - emit_deactivated(old_role.c_str()); + case TaskVisible::INVISIBLE : + if(!trigger_homescreen) + { + emit_invisible(old_role); + emit_deactivated(old_role); + } + break; + default : + // TaskVisible::REMOTE_VISIBLE, TaskVisible::REMOTE_INVISIBLE is this case + // If this action is for slave, send to slave + break; } if (ret != WMError::SUCCESS) @@ -1929,7 +1962,7 @@ WMError WindowManager::doEndDraw(unsigned req_num) if(act_flush.visible == TaskVisible::VISIBLE) { - this->emit_flushdraw(old_role.c_str()); + this->emit_flushdraw(old_role); } else if(act_flush.visible == TaskVisible::REQ_REMOTE_VISIBLE) { diff --git a/src/window_manager.hpp b/src/window_manager.hpp index c4ad0f5..18182b2 100644 --- a/src/window_manager.hpp +++ b/src/window_manager.hpp @@ -66,7 +66,6 @@ extern const char kKeyIds[]; struct id_allocator { unsigned next = 1; - // Surfaces that where requested but not yet created std::unordered_map id2name; std::unordered_map name2id; @@ -218,26 +217,27 @@ class WindowManager result api_request_surface(char const *appid, char const *role); char const *api_request_surface(char const *appid, char const *role, char const *ivi_id); bool api_set_role(char const *appid, char const *role); - void api_activate_surface(char const *appid, char const *role, char const *drawing_area, const reply_func &reply); + void api_activate_window(char const *appid, char const *role, char const *drawing_area, const reply_func &reply); void api_activate_surface_for_slave(char const *appid, char const *drawing_name, char const *drawing_area, const reply_func &reply); void api_activate_surface_to_master(char const *appid, char const *drawing_name, char const *drawing_area, const reply_func &reply); - void api_deactivate_surface(char const *appid, char const *role, const reply_func &reply); + void api_deactivate_window(char const *appid, char const *role, const reply_func &reply); void api_deactivate_surface_for_slave(char const *appid, char const *drawing_name, const reply_func &reply); void api_deactivate_surface_to_master(char const *appid, char const *drawing_name, const reply_func &reply); void api_enddraw(char const *appid, char const *role); + int api_subscribe(afb_req req, int event_id); void api_enddraw_for_remote(char const *appid, char const *drawing_name); bool api_client_set_render_order(const char *appid, const std::vector &render_order); std::string api_client_attach_service_surface(const char* appid, const char* dest, const char* service_surface); result api_get_display_info(); result api_get_area_info(char const *role); result api_get_car_info(char const *label); - void send_event(char const *evname); - void send_event(char const *evname, char const *label); - void send_event(char const *evname, char const *label, char const *area, int x, int y, int w, int h); + void send_event(const std::string& evname); + void send_event(const std::string& evname, const std::string& role); + void send_event(const std::string& evname, const std::string& role, const std::string& area, int x, int y, int w, int h); // Events from the compositor we are interested in void surface_created(unsigned pid, unsigned surface_id); @@ -257,37 +257,18 @@ class WindowManager std::string searchApp(unsigned pid, unsigned ppid, unsigned surface, json_object* resp); void storeSurface(const std::string& appid, unsigned ppid, unsigned surface); - const std::vector kListEventName{ - "active", - "inactive", - "visible", - "invisible", - "syncDraw", - "flushDraw", - "screenUpdated", - "headlampOff", - "headlampOn", - "parkingBrakeOff", - "parkingBrakeOn", - "lightstatusBrakeOff", - "lightstatusBrakeOn", - "carStop", - "carRun", - "error"}; - std::map map_afb_event; - WMConnection wmcon; private: // WM Events to clients - void emit_activated(char const *label); - void emit_deactivated(char const *label); - void emit_syncdraw(char const *label, char const *area, int x, int y, int w, int h); + void emit_activated(const std::string& role); + void emit_deactivated(const std::string& role); + void emit_syncdraw(const std::string& role, char const *area, int x, int y, int w, int h); void emit_syncdraw(const std::string &role, const std::string &area); - void emit_flushdraw(char const *label); - void emit_visible(char const *label, bool is_visible); - void emit_invisible(char const *label); - void emit_visible(char const *label); + void emit_flushdraw(const std::string& role); + void emit_visible(const std::string& role, bool is_visible); + void emit_invisible(const std::string& role); + void emit_visible(const std::string& role); void emitHeadlampOff(); void emitHeadlampOn(); void emitParkingBrakeOff(); @@ -322,6 +303,7 @@ class WindowManager const char *check_surface_exist(const char *role); private: + std::map map_afb_event; std::unordered_map roleold2new; std::unordered_map rolenew2old; std::shared_ptr lc; @@ -330,12 +312,10 @@ class WindowManager CarInfo crr_car_info; PMWrapper pmw; + rect_map area_info; + struct id_allocator id_alloc; // ID allocation and proxy methods for lookup - struct id_allocator id_alloc; - // Surface are info (x, y, w, h) - rect_map area_info; - // FOR CES DEMO std::unordered_map tmp_surface2app; std::vector tmp_services; static const char* kDefaultOldRolesConfig; diff --git a/src/wm_layer.cpp b/src/wm_layer.cpp index d3e7073..2e30069 100644 --- a/src/wm_layer.cpp +++ b/src/wm_layer.cpp @@ -81,7 +81,7 @@ void LayerState::removeLayer(unsigned layer) this->render_order.erase(fwd_itr, this->render_order.end()); } -void LayerState::setArea(const string& app, const string& area) +void LayerState::attachAppToArea(const string& app, const string& area) { this->area2appid[area] = app; } @@ -105,15 +105,14 @@ void LayerState::dump() DUMP(" area, app : %s", apps.c_str()); } -WMLayer::WMLayer(json_object* j, unsigned uuid) : tmp_state(), state(), uuid(uuid) +WMLayer::WMLayer(json_object* j, unsigned wm_layer_id) : tmp_state(), state(), wm_layer_id(wm_layer_id) { this->name = jh::getStringFromJson(j, "name"); this->role_list = jh::getStringFromJson(j, "role"); - const char* type = jh::getStringFromJson(j, "type"); this->id_begin = static_cast(jh::getIntFromJson(j, "id_range_begin")); this->id_end = static_cast(jh::getIntFromJson(j, "id_range_end")); - if (name.size() == 0 || !type) + if (name.empty()) { HMI_ERROR("Parse Error!!"); exit(1); @@ -123,8 +122,6 @@ WMLayer::WMLayer(json_object* j, unsigned uuid) : tmp_state(), state(), uuid(uui HMI_ERROR("INVALID"); exit(1); } - string str_type = type; - this->type = (str_type == "tile") ? MANAGEMENT_TYPE::TILE : MANAGEMENT_TYPE::STACK; } unsigned WMLayer::getNewLayerID(const string& role) @@ -201,9 +198,9 @@ void WMLayer::removeLayerFromState(unsigned layer) this->tmp_state.removeLayer(layer); } -void WMLayer::setAreaToState(const string& app, const string& area) +void WMLayer::attachAppToArea(const string& app, const string& area) { - this->tmp_state.setArea(app, area); + this->tmp_state.attachAppToArea(app, area); } void WMLayer::appendArea(const string& area) @@ -211,7 +208,7 @@ void WMLayer::appendArea(const string& area) this->area_list.push_back(area); } -void WMLayer::terminateApp(unsigned id) +void WMLayer::appTerminated(unsigned id) { auto fwd_itr = std::remove_if(this->id_list.begin(), this->id_list.end(), [id](unsigned elm) { diff --git a/src/wm_layer.hpp b/src/wm_layer.hpp index a6a359e..70826d4 100644 --- a/src/wm_layer.hpp +++ b/src/wm_layer.hpp @@ -40,7 +40,7 @@ class LayerState const std::vector getIviIdList(); void addLayer(unsigned layer); void removeLayer(unsigned layer); - void setArea(const std::string& app, const std::string& area); + void attachAppToArea(const std::string& app, const std::string& area); // Debug void dump(); @@ -53,22 +53,15 @@ class LayerState class WMLayer { public: - enum MANAGEMENT_TYPE - { - TILE, - STACK - }; - - explicit WMLayer(json_object* j, unsigned uuid); + explicit WMLayer(json_object* j, unsigned wm_layer_id); ~WMLayer() = default; // Status & Setting API unsigned getNewLayerID(const std::string& role); unsigned idBegin() { return this->id_begin; } unsigned idEnd() { return this->id_end; } - unsigned getUuid() { return this->uuid; } + unsigned getWMLayerID() { return this->wm_layer_id; } const std::string& layerName(); - MANAGEMENT_TYPE layerType() { return this->type; } void appendArea(const std::string& area); LayerState& getLayerState() { return tmp_state; } WMError setLayerState(const LayerState& l); @@ -78,20 +71,21 @@ class WMLayer // Manipulation void addLayerToState(unsigned layer); void removeLayerFromState(unsigned layer); - void setAreaToState(const std::string& app, const std::string& area); - void terminateApp(unsigned layer); + void attachAppToArea(const std::string& app, const std::string& area); void update(); void undo(); + // Event + void appTerminated(unsigned layer); + // Debug void dump(); private: LayerState tmp_state; LayerState state; - unsigned uuid; + unsigned wm_layer_id; std::string name = ""; // Layer name - MANAGEMENT_TYPE type; std::string role_list; std::vector area_list; std::vector id_list; diff --git a/src/wm_layer_control.cpp b/src/wm_layer_control.cpp index 80dc0c9..75c35da 100644 --- a/src/wm_layer_control.cpp +++ b/src/wm_layer_control.cpp @@ -22,7 +22,7 @@ #include "json_helper.hpp" #define LC_AREA_PATH "/etc/areas.json" -#define LC_LAYER_SETTING_PATH "/etc/layers_setting.json" +#define LC_LAYER_SETTING_PATH "/etc/layers.json" #define LC_DEFAULT_AREA "fullscreen" #define BACK_GROUND_LAYER "BackGroundLayer" @@ -171,8 +171,8 @@ unsigned LayerControl::getNewLayerID(const string& role, string* layer_name) if(ret != 0) { *layer_name = l->layerName(); - unsigned uid = l->getUuid(); - this->lid2wmlid[ret] = uid; + unsigned wmlid = l->getWMLayerID(); + this->lid2wmlid[ret] = wmlid; break; } } @@ -181,8 +181,8 @@ unsigned LayerControl::getNewLayerID(const string& role, string* layer_name) shared_ptr LayerControl::getWMLayer(unsigned layer) { - unsigned uuid = this->lid2wmlid[layer]; - return this->wm_layers[uuid]; + unsigned wm_lid = this->lid2wmlid[layer]; + return this->wm_layers[wm_lid]; } std::shared_ptr LayerControl::getWMLayer(std::string layer_name) @@ -574,11 +574,11 @@ WMError LayerControl::layoutChange(const WMAction& action) // Store the state who is assigned to the area if(wm_layer->hasLayerID(layer)) { - wm_layer->setAreaToState(action.client->appID(), action.area); + wm_layer->attachAppToArea(action.client->appID(), action.area); /* TODO: manipulate state directly - LayerState ls = wm_layer->getLayerState(); - ls.setArea(action.client->appID(), action.area); - wm_layer->dump(); */ + LayerState ls = wm_layer->getLayerState(); + ls.seattachAppToAreatArea(action.client->appID(), action.area); + wm_layer->dump(); */ } } @@ -619,11 +619,14 @@ WMError LayerControl::visibilityChange(const WMAction& action) return ret; } -void LayerControl::terminateApp(const shared_ptr client) +void LayerControl::appTerminated(const shared_ptr client) { for(auto& l : this->wm_layers) { - l->terminateApp(client->layerID()); + if(l->hasLayerID(client->layerID())) + { + l->appTerminated(client->layerID()); + } } } @@ -724,43 +727,21 @@ void LayerControl::dispatchLayerPropChangeEvent(unsigned id, WMError LayerControl::makeVisible(const shared_ptr client) { WMError ret = WMError::SUCCESS; - // Don't check here the client is not nullptr + // Don't check here wheher client is nullptr or not unsigned layer = client->layerID(); this->moveForeGround(client); ilm_layerSetVisibility(layer, ILM_TRUE); - /* for(auto& wm_layer : this->wm_layers) - { - if(wm_layer->hasLayerID(layer)) - { - LayerState ls = wm_layer->getLayerState(); - ls.addLayer(layer);; - } - } */ - - // Move foreground from back ground layer - /* for(auto& wm_layer : this->wm_layers) - { - if(wm_layer->layerName() == "BackGroundLayer") - { - if(wm_layer->hasRole(client->role())) - { - LayerState ls = wm_layer->getLayerState(); - ls.removeLayer(layer); - } - break; - } - } */ - return ret; } WMError LayerControl::makeInvisible(const shared_ptr client) { WMError ret = WMError::SUCCESS; - unsigned layer = client->layerID(); // Don't check here the client is not nullptr + // Don't check here the client is not nullptr + unsigned layer = client->layerID(); bool mv_ok = this->moveBackGround(client); @@ -770,19 +751,6 @@ WMError LayerControl::makeInvisible(const shared_ptr client) ilm_layerSetVisibility(layer, ILM_FALSE); } - //ilm_layerSetDestinationRectangle(layer, 0, 0, 0, 0); - - /* for(auto& wm_layer : this->wm_layers) - { - if(wm_layer->hasLayerID(layer)) - { - LayerState ls = wm_layer->getLayerState(); - ls.removeLayer(layer);; - } - } */ - - - return ret; } @@ -908,4 +876,4 @@ bool LayerControl::moveForeGround(const shared_ptr client) return ret; } -} // namespace wm +} // namespace wm \ No newline at end of file diff --git a/src/wm_layer_control.hpp b/src/wm_layer_control.hpp index fa7c7cb..fef71ff 100644 --- a/src/wm_layer_control.hpp +++ b/src/wm_layer_control.hpp @@ -46,9 +46,10 @@ class LayerControlCallbacks { // callback functions std::function surfaceCreated; std::function surfaceDestroyed; - /* std::function surfaceDestroyed; + /* std::function layerCreated; - std::function layerDestroyed; */ + std::function layerDestroyed; + */ }; class WMLayer; @@ -71,19 +72,14 @@ class LayerControl void setupArea(const rectangle& base_rct, double scaling); Screen getScreenInfo(); double scale(); - // void setRenderOrder(const std::vector layer_render_order); - // std::vector getAllRenderOrder(); - // std::vector>& getAllLayers(); - // std::vector getRenderOrder(const std::string& layer_name); WMError updateLayer(LayerState& layer_state); WMError renderLayers(); WMError renderLayersRemote(); WMError setXDGSurfaceOriginSize(unsigned surface); - // WMError renderWMLayers(); void undoUpdate(); WMError layoutChange(const WMAction& action); WMError visibilityChange(const WMAction &action); - void terminateApp(const std::shared_ptr client); + void appTerminated(const std::shared_ptr client); // Don't use this function. void dispatchCreateEvent(ilmObjectType object, unsigned id, bool created); @@ -115,4 +111,4 @@ class LayerControl LayerControlCallbacks cb; }; -} // namespace wm +} // namespace wm \ No newline at end of file -- cgit 1.2.3-korg