Avoid seg fault when no output exists
[apps/agl-service-windowmanager.git] / src / window_manager.cpp
index 24b6f30..28692ca 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ * Copyright (c) 2018 Konsulko Group
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +20,7 @@
 
 #include "window_manager.hpp"
 #include "json_helper.hpp"
+#include "util.hpp"
 #include "applist.hpp"
 
 extern "C"
@@ -123,17 +125,7 @@ WindowManager::WindowManager(wl::display *d)
       id_alloc{},
       pending_events(false)
 {
-    char const *path_layers_json = getenv("AFM_APP_INSTALL_DIR");
-    std::string path;
-    if (!path_layers_json)
-    {
-        HMI_ERROR("wm", "AFM_APP_INSTALL_DIR is not defined");
-        path = std::string(path_layers_json);
-    }
-    else
-    {
-        path = std::string(path_layers_json) + std::string("/etc/layers.json");
-    }
+    std::string path(get_file_path("layers.json"));
 
     try
     {
@@ -202,13 +194,19 @@ int WindowManager::init()
             this->controller->chooks = &this->chooks;
 
             // This protocol needs the output, so lets just add our mapping here...
-            this->controller->add_proxy_to_id_mapping(
-                this->outputs.front()->proxy.get(),
-                wl_proxy_get_id(reinterpret_cast<struct wl_proxy *>(
-                    this->outputs.front()->proxy.get())));
-
-            // Create screen
-            this->controller->create_screen(this->outputs.front()->proxy.get());
+            if(!this->outputs.empty()) {
+                // FIXME : Work around to avoid signal 11. Window Manager can't handle hotplug.
+                this->controller->add_proxy_to_id_mapping(
+                    this->outputs.front()->proxy.get(),
+                    wl_proxy_get_id(reinterpret_cast<struct wl_proxy *>(
+                        this->outputs.front()->proxy.get())));
+
+                // Create screen
+                this->controller->create_screen(this->outputs.front()->proxy.get());
+            }
+            else {
+                HMI_WARNING("wm", "No output object. Window Manager can't handle screen");
+            }
 
             // Set display to controller
             this->controller->display = this->display;
@@ -657,6 +655,10 @@ void WindowManager::startTransitionWrapper(std::vector<WMAction> &actions)
         {
             bool found;
             auto const &surface_id = this->lookup_id(act.role.c_str());
+            if(surface_id == nullopt)
+            {
+                goto proc_remove_request;
+            }
             std::string appid = g_app_list.getAppID(*surface_id, act.role, &found);
             if (!found)
             {
@@ -1367,19 +1369,7 @@ const char* WindowManager::convertRoleOldToNew(char const *old_role)
 
 int WindowManager::loadOldRoleDb()
 {
-    // Get afm application installed dir
-    char const *afm_app_install_dir = getenv("AFM_APP_INSTALL_DIR");
-    HMI_DEBUG("wm", "afm_app_install_dir:%s", afm_app_install_dir);
-
-    std::string file_name;
-    if (!afm_app_install_dir)
-    {
-        HMI_ERROR("wm", "AFM_APP_INSTALL_DIR is not defined");
-    }
-    else
-    {
-        file_name = std::string(afm_app_install_dir) + std::string("/etc/old_roles.db");
-    }
+    std::string file_name(get_file_path("old_roles.db"));
 
     // Load old_role.db
     json_object* json_obj;