X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fmain.cpp;h=64836554732b36cb68ae3682fde41c6bf7802edb;hb=cd01ca2a616fd98b3f61e76ba3f63cf57bb0e64d;hp=36577fe9bf0cfd16672ff579b0fe06cdeaf8b617;hpb=b1f7a756ff0fce7ff38d24b256476902f748be0b;p=apps%2Fagl-service-windowmanager.git diff --git a/src/main.cpp b/src/main.cpp index 36577fe..6483655 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -56,7 +56,7 @@ int afb_instance::init() return this->wmgr.init(); } -int _binding_init() +static int _binding_init() { HMI_NOTICE("WinMan ver. %s", WINMAN_VERSION_STRING); @@ -78,7 +78,7 @@ error: return -1; } -int binding_init() noexcept +static int binding_init (afb_api_t api) noexcept { try { @@ -102,7 +102,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 *) {}); @@ -110,21 +110,20 @@ static void cbRemoveClientCtxt(void *data) delete ctxt; } -static void createSecurityContext(afb_req req, const char* appid, const char* role) +static void createSecurityContext(afb_req_t req, const char* appid, const char* role) { WMClientCtxt *ctxt = (WMClientCtxt *)afb_req_context_get(req); if (!ctxt) { // Create Security Context at first time - const char *new_role = g_afb_instance->wmgr.convertRoleOldToNew(role); - WMClientCtxt *ctxt = new WMClientCtxt(appid, new_role); + WMClientCtxt *ctxt = new WMClientCtxt(appid, role); HMI_DEBUG("create session for %s", ctxt->name.c_str()); afb_req_session_set_LOA(req, 1); afb_req_context_set(req, ctxt, cbRemoveClientCtxt); } } -void windowmanager_requestsurface(afb_req req) noexcept +void windowmanager_requestsurface(afb_req_t req) noexcept { std::lock_guard guard(binding_m); if (g_afb_instance == nullptr) @@ -170,7 +169,7 @@ void windowmanager_requestsurface(afb_req req) noexcept } } -void windowmanager_requestsurfacexdg(afb_req req) noexcept +void windowmanager_requestsurfacexdg(afb_req_t req) noexcept { std::lock_guard guard(binding_m); if (g_afb_instance == nullptr) @@ -223,7 +222,7 @@ void windowmanager_requestsurfacexdg(afb_req req) noexcept } } -void windowmanager_activatewindow(afb_req req) noexcept +void windowmanager_activatewindow(afb_req_t req) noexcept { std::lock_guard guard(binding_m); if (g_afb_instance == nullptr) @@ -251,7 +250,7 @@ void windowmanager_activatewindow(afb_req req) noexcept char* appid = afb_req_get_application_id(req); if(appid) { - g_afb_instance->wmgr.api_activate_surface( + g_afb_instance->wmgr.api_activate_window( appid, a_drawing_name, a_drawing_area, [&req](const char *errmsg) { if (errmsg != nullptr) @@ -273,7 +272,7 @@ void windowmanager_activatewindow(afb_req req) noexcept } } -void windowmanager_deactivatewindow(afb_req req) noexcept +void windowmanager_deactivatewindow(afb_req_t req) noexcept { std::lock_guard guard(binding_m); if (g_afb_instance == nullptr) @@ -294,7 +293,7 @@ void windowmanager_deactivatewindow(afb_req req) noexcept char* appid = afb_req_get_application_id(req); if(appid) { - g_afb_instance->wmgr.api_deactivate_surface( + g_afb_instance->wmgr.api_deactivate_window( appid, a_drawing_name, [&req](const char *errmsg) { if (errmsg != nullptr) @@ -316,7 +315,7 @@ void windowmanager_deactivatewindow(afb_req req) noexcept } } -void windowmanager_enddraw(afb_req req) noexcept +void windowmanager_enddraw(afb_req_t req) noexcept { std::lock_guard guard(binding_m); if (g_afb_instance == nullptr) @@ -350,7 +349,7 @@ void windowmanager_enddraw(afb_req req) noexcept } } -void windowmanager_getdisplayinfo_thunk(afb_req req) noexcept +void windowmanager_getdisplayinfo_thunk(afb_req_t req) noexcept { std::lock_guard guard(binding_m); if (g_afb_instance == nullptr) @@ -377,7 +376,7 @@ void windowmanager_getdisplayinfo_thunk(afb_req req) noexcept } } -void windowmanager_getareainfo_thunk(afb_req req) noexcept +void windowmanager_getareainfo_thunk(afb_req_t req) noexcept { std::lock_guard guard(binding_m); if (g_afb_instance == nullptr) @@ -414,7 +413,14 @@ void windowmanager_getareainfo_thunk(afb_req req) noexcept } } -void windowmanager_wm_subscribe(afb_req req) noexcept +void windowmanager_get_area_list(afb_req_t req) noexcept +{ + std::lock_guard guard(binding_m); + json_object* ret = g_afb_instance->wmgr.api_get_area_list(); + afb_req_success(req, ret, nullptr); +} + +void windowmanager_change_area_size(afb_req_t req) noexcept { std::lock_guard guard(binding_m); if (g_afb_instance == nullptr) @@ -423,36 +429,60 @@ void windowmanager_wm_subscribe(afb_req req) noexcept return; } - try + char* appid = afb_req_get_application_id(req); + if(appid) { + ChangeAreaReq change_req; + change_req.appname = appid; + change_req.save = false; json_object *jreq = afb_req_json(req); - json_object *j = nullptr; - if (!json_object_object_get_ex(jreq, "event", &j)) + json_object *jsave, *jareas; + HMI_INFO("json_check, %s", json_object_get_string(jreq)); + if(json_object_object_get_ex(jreq, "save", &jsave)) { - afb_req_fail(req, "failed", "Need char const* argument event"); - return; + change_req.save = json_object_get_boolean(jsave); } - int event_id = json_object_get_int(j); - int ret = g_afb_instance->wmgr.api_subscribe(req, event_id); - - if (ret) + if (json_object_object_get_ex(jreq, "areas", &jareas)) { - afb_req_fail(req, "failed", "Error: afb_req_subscribe()"); - return; + int size = json_object_array_length(jareas); + for(int i = 0; i < size; i++) + { + json_object* elem = json_object_array_get_idx(jareas, i); + struct rect rect; + std::string name = jh::getStringFromJson(elem, "name"); + json_object* jrect; + if(json_object_object_get_ex(elem, "rect", &jrect)) + { + rect.x = jh::getIntFromJson(jrect, "x"); + rect.y = jh::getIntFromJson(jrect, "y"); + rect.w = jh::getIntFromJson(jrect, "w"); + rect.h = jh::getIntFromJson(jrect, "h"); + } + else + { + HMI_ERROR("bad request @area name :%s", name.c_str()); + afb_req_fail(req, "failed", "bad request"); + return; + } + change_req.area_req[name] = rect; + } + if(change_req.area_req.size() != 0) + { + g_afb_instance->wmgr.api_change_area_size(change_req); + } + afb_req_success(req, nullptr, nullptr); } - afb_req_success(req, NULL, "success"); + free(appid); } - catch (std::exception &e) + else { - afb_req_fail_f(req, "failed", "Uncaught exception while calling wm_subscribe: %s", e.what()); - return; + afb_req_fail(req, "failed", nullptr); } } -void windowmanager_list_drawing_names(afb_req req) noexcept +void windowmanager_wm_subscribe(afb_req_t req) noexcept { - /* std::lock_guard guard(binding_m); - + std::lock_guard guard(binding_m); if (g_afb_instance == nullptr) { afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?"); @@ -461,26 +491,31 @@ void windowmanager_list_drawing_names(afb_req req) noexcept 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()) + json_object *jreq = afb_req_json(req); + json_object *j = nullptr; + if (!json_object_object_get_ex(jreq, "event", &j)) { - afb_req_fail(req, "failed", ret.unwrap_err()); + afb_req_fail(req, "failed", "Need char const* argument event"); return; } + wm::WindowManager::EventType event_id = (wm::WindowManager::EventType)json_object_get_int(j); + bool ret = g_afb_instance->wmgr.api_subscribe(req, event_id); - afb_req_success(req, ret.unwrap(), "success"); + if (!ret) + { + afb_req_fail(req, "failed", "Error: afb_req_subscribe()"); + return; + } + afb_req_success(req, NULL, "success"); } catch (std::exception &e) { - afb_req_fail_f(req, "failed", "Uncaught exception while calling list_drawing_names: %s", e.what()); + afb_req_fail_f(req, "failed", "Uncaught exception while calling wm_subscribe: %s", e.what()); return; - } */ - afb_req_success(req, NULL, "not-implemented"); + } } -void windowmanager_ping(afb_req req) noexcept +void windowmanager_ping(afb_req_t req) noexcept { std::lock_guard guard(binding_m); @@ -495,89 +530,7 @@ 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; - } */ - afb_req_fail(req, NULL, "not-implemented"); -} - -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; - } */ - afb_req_fail(req, NULL, "not-implemented"); -} - -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; - } */ - afb_req_fail(req, NULL, "not-implemented"); -} - -void windowmanager_debug_terminate(afb_req req) noexcept +void windowmanager_debug_terminate(afb_req_t req) noexcept { std::lock_guard guard(binding_m); if (g_afb_instance == nullptr) @@ -604,22 +557,32 @@ void windowmanager_debug_terminate(afb_req req) noexcept } } -const struct afb_verb_v2 windowmanager_verbs[] = { - {"requestSurface", windowmanager_requestsurface, nullptr, nullptr, AFB_SESSION_NONE}, - {"requestSurfaceXDG", windowmanager_requestsurfacexdg, nullptr, nullptr, AFB_SESSION_NONE}, - {"activateWindow", windowmanager_activatewindow, nullptr, nullptr, AFB_SESSION_NONE}, - {"deactivateWindow", windowmanager_deactivatewindow, nullptr, nullptr, AFB_SESSION_NONE}, - {"endDraw", windowmanager_enddraw, nullptr, nullptr, AFB_SESSION_NONE}, - {"getDisplayInfo", windowmanager_getdisplayinfo_thunk, nullptr, nullptr, AFB_SESSION_NONE}, - {"getAreaInfo", windowmanager_getareainfo_thunk, 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}, - {}}; - -extern "C" const struct afb_binding_v2 afbBindingV2 = { - "windowmanager", nullptr, nullptr, windowmanager_verbs, nullptr, binding_init, nullptr, 0}; +const afb_verb_t windowmanager_verbs[] = { + { .verb = "requestSurface", .callback = windowmanager_requestsurface }, + { .verb = "requestSurfaceXDG", .callback = windowmanager_requestsurfacexdg }, + { .verb = "activateWindow", .callback = windowmanager_activatewindow }, + { .verb = "deactivateWindow", .callback = windowmanager_deactivatewindow }, + { .verb = "endDraw", .callback = windowmanager_enddraw }, + { .verb = "getDisplayInfo", .callback = windowmanager_getdisplayinfo_thunk }, + { .verb = "getAreaInfo", .callback = windowmanager_getareainfo_thunk }, + { .verb = "changeAreaSize", .callback = windowmanager_change_area_size }, + { .verb = "getAreaList", .callback = windowmanager_get_area_list }, + { .verb = "wm_subscribe", .callback = windowmanager_wm_subscribe }, + { .verb = "ping", .callback = windowmanager_ping }, + { .verb = "debug_terminate", .callback = windowmanager_debug_terminate }, + {} }; + +extern "C" const afb_binding_t afbBindingExport = { + .api = "windowmanager", + .specification = "windowmanager", + .info = "windowmanager", + .verbs = windowmanager_verbs, + .preinit = nullptr, + .init = binding_init, + .onevent = nullptr, + .userdata = nullptr, + .provide_class = nullptr, + .require_class = nullptr, + .require_api = nullptr, + .noconcurrency = 0 +};