From 13096fe59f29a1e3710c3d975d08a344af40e6c6 Mon Sep 17 00:00:00 2001 From: Tadao Tanikawa Date: Tue, 12 Dec 2017 21:44:57 +0900 Subject: Support XDG application To run XDG application on AGL HomeScreen/WindowManager, a new binding API of WindowManager is added. This api is used only by AGL XDG-Launcher and all xdg applications should be packed as wgt compatible to AGL Application framework. Bug-AGL: SPEC-1096 Change-Id: I33dd3b056c736ef374e2251e818541ddd699877b Signed-off-by: Tadao Tanikawa --- generate-binding-glue.py | 7 +++++++ src/afb_binding_api.cpp | 10 ++++++++++ src/app.cpp | 30 ++++++++++++++++++++++++++++++ src/app.hpp | 9 +++++++++ 4 files changed, 56 insertions(+) diff --git a/generate-binding-glue.py b/generate-binding-glue.py index 376350a..a7be2da 100644 --- a/generate-binding-glue.py +++ b/generate-binding-glue.py @@ -132,6 +132,13 @@ API = { { 'name': 'drawing_name', 'type': 'char const*', 'jtype': 'string' }, ], }, + { + 'name': 'requestsurfacexdg', + 'args': [ + { 'name': 'drawing_name', 'type': 'char const*', 'jtype': 'string' }, + { 'name': 'ivi_id', 'type': 'char const*', 'jtype': 'string' }, + ], + }, { 'name': 'activatesurface', 'args': [ diff --git a/src/afb_binding_api.cpp b/src/afb_binding_api.cpp index 3c75524..735a572 100644 --- a/src/afb_binding_api.cpp +++ b/src/afb_binding_api.cpp @@ -38,6 +38,16 @@ binding_api::result_type binding_api::requestsurface( return Ok(json_object_new_int(r.unwrap())); } +binding_api::result_type binding_api::requestsurfacexdg( + char const *drawing_name, char const *ivi_id) { + auto r = this->app->api_request_surface(drawing_name, ivi_id); + if (r != nullptr) { + HMI_DEBUG("wm", "%s failed with error: %s", __func__, r); + return Err(r); + } + return Ok(json_object_new_object()); +} + binding_api::result_type binding_api::activatesurface( char const *drawing_name, char const *drawing_area) { HMI_DEBUG("wm", "%s drawing_name %s, drawing_area %s", __func__, drawing_name, drawing_area); diff --git a/src/app.cpp b/src/app.cpp index 307217e..82701b7 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -686,6 +686,36 @@ result App::api_request_surface(char const *drawing_name) { return Err("Surface already present"); } +char const *App::api_request_surface(char const *drawing_name, + char const *ivi_id) { + ST(); + + auto lid = this->layers.get_layer_id(std::string(drawing_name)); + unsigned sid = std::stol(ivi_id); + + if (!lid) { + return "Drawing name does not match any role"; + } + + auto rname = this->lookup_id(drawing_name); + + if (rname) { + return "Surface already present"; + } + + // register pair drawing_name and ivi_id + this->id_alloc.register_name_id(drawing_name, sid); + this->layers.add_surface(sid, *lid); + + // this surface is already created + HMI_DEBUG("wm", "surface_id is %u, layer_id is %u", sid, *lid); + + this->controller->layers[*lid]->add_surface( + this->controller->surfaces[sid].get()); + + return nullptr; +} + void App::activate(int id) { auto ip = this->controller->sprops.find(id); if (ip != this->controller->sprops.end()) { diff --git a/src/app.hpp b/src/app.hpp index 413d1c9..59f3104 100644 --- a/src/app.hpp +++ b/src/app.hpp @@ -81,6 +81,14 @@ struct id_allocator { return sid; } + // Insert a new ID which defined outside + void register_name_id(std::string const &name, unsigned sid) { + this->id2name[sid] = name; + this->name2id[name] = sid; + HMI_DEBUG("wm", "register id %u with name %s", sid, name.c_str()); + return; + } + // Lookup by ID or by name optional lookup(std::string const &name) const { auto i = this->name2id.find(name); @@ -178,6 +186,7 @@ struct App { void set_pending_events(); result api_request_surface(char const *drawing_name); + char const *api_request_surface(char const *drawing_name, char const *ivi_id); char const *api_activate_surface(char const *drawing_name, char const *drawing_area); char const *api_deactivate_surface(char const *drawing_name); char const *api_enddraw(char const *drawing_name); -- cgit 1.2.3-korg