diff options
-rw-r--r-- | layers.json | 2 | ||||
-rw-r--r-- | src/app.cpp | 5 | ||||
-rw-r--r-- | src/main.cpp | 54 |
3 files changed, 59 insertions, 2 deletions
diff --git a/layers.json b/layers.json index 7ee3e21..8a04d7b 100644 --- a/layers.json +++ b/layers.json @@ -22,7 +22,7 @@ "comment": "Single layer map for the HomeScreen" }, { - "role": "MediaPlayer|Radio|Phone|Navigation|HVAC|Settings|Dashboard|POI|Mixer", + "role": "Music|Video|WebBrowser|MediaPlayer|Radio|Phone|Navigation|HVAC|Settings|Dashboard|POI|Mixer", "name": "apps", "layer_id": 1001, "area": { "type": "rect", "rect": { "x": 0, "y": 218, "width": -1, "height": -433 } }, diff --git a/src/app.cpp b/src/app.cpp index bf84b22..d218f3e 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -628,7 +628,7 @@ void App::surface_created(uint32_t surface_id) { this->controller->layers[*layer_id]->add_surface( this->controller->surfaces[surface_id].get()); - + this->layout_commit(); // activate the main_surface right away /*if (surface_id == static_cast<unsigned>(this->layers.main_surface)) { HMI_DEBUG("wm", "Activating main_surface (%d)", surface_id); @@ -735,6 +735,7 @@ char const *App::api_request_surface(char const *drawing_name, this->controller->layers[*lid]->add_surface( this->controller->surfaces[sid].get()); + this->layout_commit(); return nullptr; } @@ -751,6 +752,7 @@ void App::activate(int id) { // FOR CES DEMO >>> if ((0 == strcmp(label, "Radio")) || (0 == strcmp(label, "MediaPlayer")) + || (0 == strcmp(label, "Music")) || (0 == strcmp(label, "Navigation"))) { for (auto i = surface_bg.begin(); i != surface_bg.end(); ++i) { if (id == *i) { @@ -790,6 +792,7 @@ void App::deactivate(int id) { // FOR CES DEMO >>> if ((0 == strcmp(label, "Radio")) || (0 == strcmp(label, "MediaPlayer")) + || (0 == strcmp(label, "Music")) || (0 == strcmp(label, "Navigation"))) { // Store id diff --git a/src/main.cpp b/src/main.cpp index e8ae75a..0197c3c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -30,6 +30,13 @@ extern "C" { #include <systemd/sd-event.h> } +typedef struct wmClientCtxt{ + std::string name; + wmClientCtxt(const char* appName){ + name = appName; + } +} wmClientCtxt; + struct afb_instance { std::unique_ptr<wl::display> display; wm::App app; @@ -149,6 +156,30 @@ int binding_init() noexcept { return -1; } +static bool checkFirstReq(afb_req req){ + wmClientCtxt* ctxt = (wmClientCtxt*)afb_req_context_get(req); + return (ctxt) ? false : true; +} + +static void cbRemoveClientCtxt(void* data){ + wmClientCtxt* ctxt = (wmClientCtxt*)data; + if(ctxt == nullptr){ + return; + } + HMI_DEBUG("wm","remove app %s", ctxt->name.c_str()); + // Lookup surfaceID and remove it because App is dead. + auto pSid = g_afb_instance->app.id_alloc.lookup(ctxt->name.c_str()); + if(pSid){ + auto sid = *pSid; + g_afb_instance->app.id_alloc.remove_id(sid); + g_afb_instance->app.layers.remove_surface(sid); + g_afb_instance->app.controller->sprops.erase(sid); + g_afb_instance->app.controller->surfaces.erase(sid); + HMI_DEBUG("wm", "delete surfaceID %d", sid); + } + delete ctxt; +} + void windowmanager_requestsurface(afb_req req) noexcept { std::lock_guard<std::mutex> guard(binding_m); #ifdef ST @@ -166,7 +197,30 @@ void windowmanager_requestsurface(afb_req req) noexcept { return; } + /* Create Security Context */ + bool isFirstReq = checkFirstReq(req); + if(!isFirstReq){ + wmClientCtxt* ctxt = (wmClientCtxt*)afb_req_context_get(req); + HMI_DEBUG("wm", "You're %s.", ctxt->name.c_str()); + if(ctxt->name != std::string(a_drawing_name)){ + afb_req_fail_f(req, "failed", "Dont request with other name: %s for now", a_drawing_name); + HMI_DEBUG("wm", "Don't request with other name: %s for now", a_drawing_name); + return; + } + } + auto ret = g_afb_instance->app.api_request_surface(a_drawing_name); + + if(isFirstReq){ + wmClientCtxt* ctxt = new wmClientCtxt(a_drawing_name); + HMI_DEBUG("wm", "create session for %s", ctxt->name.c_str()); + afb_req_session_set_LOA(req, 1); + afb_req_context_set(req, ctxt, cbRemoveClientCtxt); + } + else{ + HMI_DEBUG("wm", "session already created for %s", a_drawing_name); + } + if (ret.is_err()) { afb_req_fail(req, "failed", ret.unwrap_err()); return; |