aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.cpp
diff options
context:
space:
mode:
authorKazumasa Mitsunari <knimitz@witz-inc.co.jp>2019-01-29 13:18:17 +0900
committerKazumasa Mitsunari <knimitz@witz-inc.co.jp>2019-02-04 19:54:01 +0900
commita0fa6394c0d8b7997343d6f2a44d9c2868f4be5f (patch)
tree33dee52eb43bfbf77fafbcecbe5e96a062179853 /src/main.cpp
parentb72e372690e677c38fa9b5ae90fb7fbe5a575c76 (diff)
Fix top surface becomes invisible when background surface is crashed.
Fix top surface becomes invisible when surface on same layer, such like application layer, is crashed. To fix this issue, I refactored attaching app to layer. Originally, window manager attached app to surface. This patch is the backport of master branch. Bug-AGL : SPEC-1635 Change-Id: Ie6713e669a25662e8547aa7782551ddae60c7e01 Signed-off-by: Kazumasa Mitsunari <knimitz@witz-inc.co.jp>
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp249
1 files changed, 23 insertions, 226 deletions
diff --git a/src/main.cpp b/src/main.cpp
index b652918..8808161 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -20,7 +20,6 @@
#include <json.h>
#include "window_manager.hpp"
#include "json_helper.hpp"
-#include "wayland_ivi_wm.hpp"
extern "C"
{
@@ -41,10 +40,10 @@ typedef struct WMClientCtxt
struct afb_instance
{
- std::unique_ptr<wl::display> display;
wm::WindowManager wmgr;
- afb_instance() : display{new wl::display}, wmgr{this->display.get()} {}
+ afb_instance() : wmgr() {}
+ ~afb_instance() = default;
int init();
};
@@ -57,78 +56,11 @@ int afb_instance::init()
return this->wmgr.init();
}
-int display_event_callback(sd_event_source *evs, int /*fd*/, uint32_t events,
- void * /*data*/)
-{
- if ((events & EPOLLHUP) != 0)
- {
- HMI_ERROR("The compositor hung up, dying now.");
- delete g_afb_instance;
- g_afb_instance = nullptr;
- goto error;
- }
-
- if ((events & EPOLLIN) != 0u)
- {
- {
- g_afb_instance->wmgr.display->read_events();
- g_afb_instance->wmgr.set_pending_events();
- }
- {
- // We want do dispatch pending wayland events from within
- // the API context
- afb_service_call("windowmanager", "ping", json_object_new_object(),
- [](void *c, int st, json_object *j) {
- },
- nullptr);
- }
- }
-
- return 0;
-
-error:
- sd_event_source_unref(evs);
- if (getenv("WINMAN_EXIT_ON_HANGUP") != nullptr)
- {
- exit(1);
- }
- return -1;
-}
-
-int _binding_init()
+static int _binding_init()
{
HMI_NOTICE("WinMan ver. %s", WINMAN_VERSION_STRING);
- if (g_afb_instance != nullptr)
- {
- HMI_ERROR("Wayland context already initialized?");
- return 0;
- }
-
- if (getenv("XDG_RUNTIME_DIR") == nullptr)
- {
- HMI_ERROR("Environment variable XDG_RUNTIME_DIR not set");
- goto error;
- }
-
- {
- // wait until wayland compositor starts up.
- int cnt = 0;
- g_afb_instance = new afb_instance;
- while (!g_afb_instance->display->ok())
- {
- cnt++;
- if (20 <= cnt)
- {
- HMI_ERROR("Could not connect to compositor");
- goto error;
- }
- HMI_ERROR("Wait to start weston ...");
- sleep(1);
- delete g_afb_instance;
- g_afb_instance = new afb_instance;
- }
- }
+ g_afb_instance = new afb_instance;
if (g_afb_instance->init() == -1)
{
@@ -136,17 +68,6 @@ int _binding_init()
goto error;
}
- {
- int ret = sd_event_add_io(afb_daemon_get_event_loop(), nullptr,
- g_afb_instance->display->get_fd(), EPOLLIN,
- display_event_callback, g_afb_instance);
- if (ret < 0)
- {
- HMI_ERROR("Could not initialize afb_instance event handler: %d", -ret);
- goto error;
- }
- }
-
atexit([] { delete g_afb_instance; });
return 0;
@@ -181,15 +102,9 @@ 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 *errmsg) {
- if (errmsg != nullptr)
- {
- HMI_ERROR(errmsg);
- return;
- }
- });
+ [](const char *) {});
g_afb_instance->wmgr.removeClient(ctxt->name);
delete ctxt;
@@ -336,12 +251,12 @@ 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)
{
- HMI_ERROR("wm", errmsg);
+ HMI_ERROR(errmsg);
afb_req_fail(req, "failed", errmsg);
return;
}
@@ -379,12 +294,12 @@ 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)
{
- HMI_ERROR("wm", errmsg);
+ HMI_ERROR(errmsg);
afb_req_fail(req, "failed", errmsg);
return;
}
@@ -517,11 +432,10 @@ 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);
- if (ret)
+ wm::WindowManager::EventType event_id = (wm::WindowManager::EventType)json_object_get_int(j);
+ bool ret = g_afb_instance->wmgr.api_subscribe(req, event_id);
+
+ if (!ret)
{
afb_req_fail(req, "failed", "Error: afb_req_subscribe()");
return;
@@ -535,132 +449,19 @@ void windowmanager_wm_subscribe(afb_req req) noexcept
}
}
-void windowmanager_list_drawing_names(afb_req req) noexcept
+void windowmanager_ping(afb_req_t req) noexcept
{
std::lock_guard<std::mutex> 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<std::mutex> guard(binding_m);
if (g_afb_instance == nullptr)
{
afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?");
return;
}
-
- try
+ else
{
-
- g_afb_instance->wmgr.api_ping();
-
afb_req_success(req, NULL, "success");
}
- catch (std::exception &e)
- {
- afb_req_fail_f(req, "failed", "Uncaught exception while calling ping: %s", e.what());
- return;
- }
-}
-
-void windowmanager_debug_status(afb_req req) noexcept
-{
- std::lock_guard<std::mutex> 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<std::mutex> 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<std::mutex> 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
@@ -691,19 +492,15 @@ 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},
+ {"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},
{}};