From b265543fadea666adc70956e4e676d7032a4f05c Mon Sep 17 00:00:00 2001 From: Woongsuk Cho Date: Fri, 7 Dec 2018 11:07:04 +0900 Subject: [PATCH] Remove dependency from Elementary To use dotnet-launcher on the headless device (device without a graphical user interface), remove build and runtime dependency from Elementary. Elementary is used in ther launcher.cc file to precreate elm_window for enhancing application startup time. To remove dependency, load elementary library with dlopen. If libelementary.so.1 file doesnot exist, precreation is skipped. --- NativeLauncher/CMakeLists.txt | 4 +-- NativeLauncher/launcher/launcher.cc | 64 ++++++++++++++++++++++++++++--------- packaging/dotnet-launcher.spec | 1 - 3 files changed, 51 insertions(+), 18 deletions(-) diff --git a/NativeLauncher/CMakeLists.txt b/NativeLauncher/CMakeLists.txt index 600f4a6..5b98b24 100644 --- a/NativeLauncher/CMakeLists.txt +++ b/NativeLauncher/CMakeLists.txt @@ -4,7 +4,7 @@ PROJECT("dotnet-tools") MESSAGE("CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}") INCLUDE(FindPkgConfig) -PKG_CHECK_MODULES(${PROJECT_NAME} REQUIRED aul pkgmgr-info pkgmgr-installer dlog ecore bundle dlog liblaunchpad elementary glib-2.0 libsmack capi-appfw-app-common storage) +PKG_CHECK_MODULES(${PROJECT_NAME} REQUIRED aul pkgmgr-info pkgmgr-installer dlog ecore bundle dlog liblaunchpad glib-2.0 libsmack capi-appfw-app-common storage) FOREACH(flag ${${PROJECT_NAME}_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") @@ -73,7 +73,7 @@ SET(${DOTNET_LAUNCHER_UTIL}_SOURCE_FILES ) ADD_LIBRARY(${DOTNET_LAUNCHER_UTIL} SHARED ${${DOTNET_LAUNCHER_UTIL}_SOURCE_FILES}) SET_TARGET_PROPERTIES(${DOTNET_LAUNCHER_UTIL} PROPERTIES COMPILE_FLAGS "-fPIC") -TARGET_LINK_LIBRARIES(${DOTNET_LAUNCHER_UTIL} ${${PROJECT_NAME}_LDFLAGS}) +TARGET_LINK_LIBRARIES(${DOTNET_LAUNCHER_UTIL} ${${PROJECT_NAME}_LDFLAGS} "-ldl") SET(DOTNET_LAUNCHER "dotnet-launcher") SET(${DOTNET_LAUNCHER}_SOURCE_FILES diff --git a/NativeLauncher/launcher/launcher.cc b/NativeLauncher/launcher/launcher.cc index 04eef9b..0bec483 100644 --- a/NativeLauncher/launcher/launcher.cc +++ b/NativeLauncher/launcher/launcher.cc @@ -21,7 +21,6 @@ #include #include -#include #include #include @@ -42,7 +41,6 @@ struct FdHandler { static int __argc; static char **__argv; -static Evas_Object *__win; class LaunchpadAdapterImpl : public LaunchpadAdapter { @@ -120,26 +118,62 @@ static void fdRemove(void *data, int fd) } } +// To run dotnet-launcher on the headless device, remove build dependency from EFL. +#define ELEMENTARY_PATH "/usr/lib/libelementary.so.1" +static void* __win; +typedef int (*elm_init_ptr)(int argc, char **argv); +typedef void (*elm_config_accel_preference_set_ptr)(const char *pref); +typedef void* (*elm_win_add_ptr)(void* parent, const char* name, int type); +typedef void (*elm_win_precreated_object_set_ptr)(void* win); + static void preCreateWindow(bundle *extra, int type, void *userData) { - int elmInitCnt = 0; - - // Precreate window - elmInitCnt = elm_init(__argc, __argv); - if (!elmInitCnt) { - _ERR("[candidate] elm_init() failed"); + struct stat sb; + if (stat(ELEMENTARY_PATH, &sb) != 0) { + _ERR("[candidate] libelememantary is not exist. skip precreation"); return; } - elm_config_accel_preference_set("hw"); + int elmInitCnt = 0; + void* handle = nullptr; + elm_init_ptr elm_init = nullptr; + elm_config_accel_preference_set_ptr elm_config_accel_preference_set = nullptr; + elm_win_add_ptr elm_win_add = nullptr; + elm_win_precreated_object_set_ptr elm_win_precreated_object_set = nullptr; + + handle = dlopen(ELEMENTARY_PATH, RTLD_NOW | RTLD_GLOBAL); + if (handle) { + elm_init = (elm_init_ptr)dlsym(handle, "elm_init"); + if (elm_init) { + elmInitCnt = elm_init(__argc, __argv); + + if (!elmInitCnt) { + _ERR("[candidate] elm_init() failed"); + return; + } + } - __win = elm_win_add(NULL, "package_name", ELM_WIN_BASIC); - if (__win == NULL) { - _ERR("[candidate] elm_win_add() failed"); - return; - } + elm_config_accel_preference_set = (elm_config_accel_preference_set_ptr)dlsym(handle, "elm_config_accel_preference_set"); + if (elm_config_accel_preference_set) { + elm_config_accel_preference_set("hw"); + } - elm_win_precreated_object_set(__win); + elm_win_add = (elm_win_add_ptr)dlsym(handle, "elm_win_add"); + if (elm_win_add) { + // enum value of "ELM_WIN_BASIC" is 0 + __win = elm_win_add(NULL, "package_name", 0); + if (__win == NULL) { + _ERR("[candidate] elm_win_add() failed"); + return; + } + } + + elm_win_precreated_object_set = (elm_win_precreated_object_set_ptr)dlsym(handle, "elm_win_precreated_object_set"); + if (elm_win_precreated_object_set) { + elm_win_precreated_object_set(__win); + } + _INFO("elm window precreation is done"); + } } int LaunchpadAdapterImpl::loaderMain(int argc, char* argv[]) diff --git a/packaging/dotnet-launcher.spec b/packaging/dotnet-launcher.spec index bfe292b..1c4f4a4 100644 --- a/packaging/dotnet-launcher.spec +++ b/packaging/dotnet-launcher.spec @@ -15,7 +15,6 @@ BuildRequires: pkgconfig(ecore) BuildRequires: pkgconfig(liblaunchpad) BuildRequires: pkgconfig(pkgmgr-info) BuildRequires: pkgconfig(pkgmgr-installer) -BuildRequires: pkgconfig(elementary) BuildRequires: pkgconfig(glib-2.0) BuildRequires: pkgconfig(libsmack) BuildRequires: pkgconfig(capi-appfw-app-common) -- 2.7.4