Support XDG application
authorTadao Tanikawa <tanikawa.tadao@jp.panasonic.com>
Tue, 12 Dec 2017 12:44:57 +0000 (21:44 +0900)
committerTadao Tanikawa <tanikawa.tadao@jp.panasonic.com>
Tue, 12 Dec 2017 12:44:57 +0000 (21:44 +0900)
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 <tanikawa.tadao@jp.panasonic.com>
generate-binding-glue.py
src/afb_binding_api.cpp
src/app.cpp
src/app.hpp

index 376350a..a7be2da 100644 (file)
@@ -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': [
index 3c75524..735a572 100644 (file)
@@ -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<json_object *>(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);
index 307217e..82701b7 100644 (file)
@@ -686,6 +686,36 @@ result<int> App::api_request_surface(char const *drawing_name) {
    return Err<int>("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()) {
index 413d1c9..59f3104 100644 (file)
@@ -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<unsigned> lookup(std::string const &name) const {
       auto i = this->name2id.find(name);
@@ -178,6 +186,7 @@ struct App {
    void set_pending_events();
 
    result<int> 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);