From 22c95375e2ab1ab229b68ef9607f6a503dc44ccc Mon Sep 17 00:00:00 2001 From: Michael Teyfel Date: Wed, 8 Aug 2018 17:18:05 +0200 Subject: wayland-ivi-extension: Added ivi-id-agent by mtey As explained in further discussions, the simple-id-agent is a basic example for reference. This commit adds the ivi-id-agent [1]. It is still a reference implementation but already offers more features (like configurations) that should be desirable for AGL. [1] https://github.com/mtey/wayland-ivi-extension/commits/xdg_support_ivi_id_agent Change-Id: I041b81b480be8fd49fded9d9c9824a0dbb3b568f Signed-off-by: Michael Teyfel --- .../0002-ivi-id-agent-added-ivi-id-agent.patch | 538 +++++++++++++++++++++ 1 file changed, 538 insertions(+) create mode 100644 recipes-graphics/wayland/wayland-ivi-extension/0002-ivi-id-agent-added-ivi-id-agent.patch (limited to 'recipes-graphics/wayland/wayland-ivi-extension/0002-ivi-id-agent-added-ivi-id-agent.patch') diff --git a/recipes-graphics/wayland/wayland-ivi-extension/0002-ivi-id-agent-added-ivi-id-agent.patch b/recipes-graphics/wayland/wayland-ivi-extension/0002-ivi-id-agent-added-ivi-id-agent.patch new file mode 100644 index 00000000..2b78357f --- /dev/null +++ b/recipes-graphics/wayland/wayland-ivi-extension/0002-ivi-id-agent-added-ivi-id-agent.patch @@ -0,0 +1,538 @@ +From 42fc715a430068cdb4484e2cb119418da8ac4e6f Mon Sep 17 00:00:00 2001 +From: Michael Teyfel +Date: Fri, 12 Oct 2018 16:46:57 +0200 +Subject: [PATCH 2/3] ivi-id-agent: added ivi-id-agent + +This is a reference implementation of an ivi-id-agent plugin. It +creates surface-ids for desktop-surfaces depending on the configuration +provided in "weston.ini". For more please refer to the reference +implementation in this commit. + +The only public interface available is the "id_agent_module_init" +function. It is responsible for initialization of structs and reading +the configuration. + +In the reference "weston.ini" two types of configurations can be found: + +[desktop-app] is used to configure a particular application. Therefore +the desired surface-id must be provided. Moreover "app-title" is the +title that is provided by the desktop application (xdg-protocol). +"app-id" behaves accordingly. Although both parameters can be set, it +is not mandatory. Finally at least one has to be set. + +[desktop-app-default] enables the id-agent to generate generic +surface-ids for unconfigured applications, e.g. for development. This +tag is optional. To generate the id an interval starting from +"default-surface-id" to "default-surface-id-max" is used. The id is +incremented until the interval is exceeded. + +In the function "get_id" a surface-id is assigned by means of the +configuration. It can be adjusted, if another behavior is desired. +In this plugin the parameters, that are described above, are evaluated. + +To use these patches please also apply the dedicated patches for +weston: https://github.com/mtey/weston/tree/xdg_support_ivi_id_agent +Since libweston-desktop is used to introduce desktop-surface support, +xdg-protocol is supported. + +Signed-off-by: Michael Teyfel +--- + ivi-id-agent-modules/ivi-id-agent/CMakeLists.txt | 69 ++++ + .../ivi-id-agent/src/ivi-id-agent.c | 381 +++++++++++++++++++++ + ivi-id-agent-modules/ivi-id-agent/weston.ini.in | 20 ++ + 3 files changed, 470 insertions(+) + create mode 100644 ivi-id-agent-modules/ivi-id-agent/CMakeLists.txt + create mode 100644 ivi-id-agent-modules/ivi-id-agent/src/ivi-id-agent.c + create mode 100644 ivi-id-agent-modules/ivi-id-agent/weston.ini.in + +diff --git a/ivi-id-agent-modules/ivi-id-agent/CMakeLists.txt b/ivi-id-agent-modules/ivi-id-agent/CMakeLists.txt +new file mode 100644 +index 0000000..2def105 +--- /dev/null ++++ b/ivi-id-agent-modules/ivi-id-agent/CMakeLists.txt +@@ -0,0 +1,69 @@ ++############################################################################### ++# ++# Copyright (C) 2017 Advanced Driver Information Technology Joint Venture GmbH ++# ++# ++# Licensed under the Apache License, Version 2.0 (the "License"); ++# you may not use this file except in compliance with the License. ++# You may obtain a copy of the License at ++# ++# http://www.apache.org/licenses/LICENSE-2.0 ++# ++# Unless required by applicable law or agreed to in writing, software ++# distributed under the License is distributed on an "AS IS" BASIS, ++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++# See the License for the specific language governing permissions and ++# limitations under the License. ++# ++############################################################################### ++ ++cmake_minimum_required (VERSION 2.6) ++ ++project(ivi-id-agent) ++ ++find_package(PkgConfig REQUIRED) ++pkg_check_modules(WAYLAND_SERVER wayland-server REQUIRED) ++pkg_check_modules(WESTON weston>=2.0.0 REQUIRED) ++pkg_check_modules(PIXMAN pixman-1 REQUIRED) ++pkg_check_modules(LIBWESTON_DESKTOP libweston-desktop-2 REQUIRED) ++ ++find_package(Threads REQUIRED) ++ ++include_directories( ++ src ++ ${WAYLAND_SERVER_INCLUDE_DIRS} ++ ${WESTON_INCLUDE_DIRS} ++ ${PIXMAN_INCLUDE_DIRS} ++) ++ ++link_directories( ++ ${WAYLAND_SERVER_LIBRARY_DIRS} ++ ${PIXMAN_LIBRARY_DIRS} ++) ++ ++ ++add_library(${PROJECT_NAME} MODULE ++ src/ivi-id-agent.c ++) ++ ++set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "") ++ ++add_dependencies(${PROJECT_NAME} ++ ${WAYLAND_SERVER_LIBRARIES} ++ ${PIXMAN_LIBRARIES} ++) ++ ++set(LIBS ++ ${LIBS} ++ ${WAYLAND_SERVER_LIBRARIES} ++ ${LIBWESTON_DESKTOP_LIBRARIES} ++) ++ ++set(CMAKE_C_LDFLAGS "-module -avoid-version") ++ ++target_link_libraries(${PROJECT_NAME} ${LIBS}) ++ ++install ( ++ TARGETS ${PROJECT_NAME} ++ LIBRARY DESTINATION lib${LIB_SUFFIX}/weston ++) +diff --git a/ivi-id-agent-modules/ivi-id-agent/src/ivi-id-agent.c b/ivi-id-agent-modules/ivi-id-agent/src/ivi-id-agent.c +new file mode 100644 +index 0000000..9bc115d +--- /dev/null ++++ b/ivi-id-agent-modules/ivi-id-agent/src/ivi-id-agent.c +@@ -0,0 +1,381 @@ ++/* ++ * Copyright (C) 2017 Advanced Driver Information Technology Joint Venture GmbH ++ * ++ * Permission to use, copy, modify, distribute, and sell this software and ++ * its documentation for any purpose is hereby granted without fee, provided ++ * that the above copyright notice appear in all copies and that both that ++ * copyright notice and this permission notice appear in supporting ++ * documentation, and that the name of the copyright holders not be used in ++ * advertising or publicity pertaining to distribution of the software ++ * without specific, written prior permission. The copyright holders make ++ * no representations about the suitability of this software for any ++ * purpose. It is provided "as is" without express or implied warranty. ++ * ++ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS ++ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND ++ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY ++ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ++ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF ++ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN ++ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ */ ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include "config-parser.h" ++#include ++ ++#ifndef INVALID_ID ++#define INVALID_ID 0xFFFFFFFF ++#endif ++ ++struct db_elem ++{ ++ struct wl_list link; ++ uint32_t surface_id; ++ char *cfg_app_id; ++ char *cfg_title; ++ struct ivi_layout_surface *layout_surface; ++}; ++ ++struct ivi_id_agent ++{ ++ uint32_t default_behavior_set; ++ uint32_t default_surface_id; ++ uint32_t default_surface_id_max; ++ struct wl_list app_list; ++ struct weston_compositor *compositor; ++ const struct ivi_layout_interface *interface; ++ ++ struct wl_listener desktop_surface_configured; ++ struct wl_listener destroy_listener; ++ struct wl_listener surface_removed; ++}; ++ ++static int32_t ++check_config_parameter(char *cfg_val, char *val) ++{ ++ if (cfg_val == NULL) ++ return IVI_SUCCEEDED; ++ else if (val == NULL || strcmp(cfg_val, val) != 0) ++ return IVI_FAILED; ++ ++ return IVI_SUCCEEDED; ++} ++ ++static int32_t ++get_id_from_config(struct ivi_id_agent *ida, struct ivi_layout_surface ++ *layout_surface) { ++ struct db_elem *db_elem; ++ char *temp_app_id = NULL; ++ char *temp_title = NULL; ++ int ret = IVI_FAILED; ++ ++ struct weston_surface *weston_surface = ++ ida->interface->surface_get_weston_surface(layout_surface); ++ ++ /* Get app id and title */ ++ struct weston_desktop_surface *wds = weston_surface_get_desktop_surface( ++ weston_surface); ++ ++ if (weston_desktop_surface_get_app_id(wds) != NULL) ++ temp_app_id = strdup(weston_desktop_surface_get_app_id(wds)); ++ ++ if (weston_desktop_surface_get_title(wds) != NULL) ++ temp_title = strdup(weston_desktop_surface_get_title(wds)); ++ ++ /* ++ * Check for every config parameter to be fulfilled. This part must be ++ * extended, if additional attributes are desired to be checked. ++ */ ++ wl_list_for_each(db_elem, &ida->app_list, link) ++ { ++ if (check_config_parameter(db_elem->cfg_app_id, temp_app_id) == 0) { ++ if (check_config_parameter(db_elem->cfg_title, temp_title) == 0) { ++ /* Found configuration for application. */ ++ int res = ida->interface->surface_set_id(layout_surface, ++ db_elem->surface_id); ++ if (res) ++ continue; ++ ++ db_elem->layout_surface = layout_surface; ++ ret = IVI_SUCCEEDED; ++ ++ break; ++ } ++ } ++ } ++ ++ free(temp_app_id); ++ free(temp_title); ++ ++ return ret; ++} ++ ++/* ++ * This function generates the id of a surface in regard to the desired ++ * parameters. For implementation of different behavior in id generation please ++ * adjust this function. ++ * In this implementation the app_id and/or title of the application is used for ++ * identification. It is also possible to use the pid, uid or gid for example. ++ */ ++static int32_t ++get_id(struct ivi_id_agent *ida, struct ivi_layout_surface *layout_surface) ++{ ++ if (get_id_from_config(ida, layout_surface) == IVI_SUCCEEDED) ++ return IVI_SUCCEEDED; ++ ++ /* No default layer available */ ++ if (ida->default_behavior_set == 0) { ++ weston_log("ivi-id-agent: Could not find configuration for application\n"); ++ goto ivi_failed; ++ ++ /* Default behavior for unknown applications */ ++ } else if (ida->default_surface_id < ida->default_surface_id_max) { ++ weston_log("ivi-id-agent: No configuration for application adding to " ++ "default layer\n"); ++ ++ /* ++ * Check if ivi-shell application already created an application with ++ * desired surface_id ++ */ ++ struct ivi_layout_surface *temp_layout_surf = ++ ida->interface->get_surface_from_id( ++ ida->default_surface_id); ++ if ((temp_layout_surf != NULL) && (temp_layout_surf != layout_surface)) { ++ weston_log("ivi-id-agent: surface_id already used by an ivi-shell " ++ "application\n"); ++ goto ivi_failed; ++ } ++ ++ ida->interface->surface_set_id(layout_surface, ++ ida->default_surface_id); ++ ida->default_surface_id++; ++ ++ } else { ++ weston_log("ivi-id-agent: Interval for default surface_id generation " ++ "exceeded\n"); ++ goto ivi_failed; ++ } ++ ++ return IVI_SUCCEEDED; ++ ++ivi_failed: ++ return IVI_FAILED; ++} ++ ++static void ++desktop_surface_event_configure(struct wl_listener *listener, ++ void *data) ++{ ++ struct ivi_id_agent *ida = wl_container_of(listener, ida, ++ desktop_surface_configured); ++ ++ struct ivi_layout_surface *layout_surface = ++ (struct ivi_layout_surface *) data; ++ ++ if (get_id(ida, layout_surface) == IVI_FAILED) ++ weston_log("ivi-id-agent: Could not create surface_id for application\n"); ++} ++ ++static void ++surface_event_remove(struct wl_listener *listener, void *data) { ++ struct ivi_id_agent *ida = wl_container_of(listener, ida, ++ surface_removed); ++ struct ivi_layout_surface *layout_surface = ++ (struct ivi_layout_surface *) data; ++ struct db_elem *db_elem = NULL; ++ ++ wl_list_for_each(db_elem, &ida->app_list, link) ++ { ++ if(db_elem->layout_surface == layout_surface) { ++ db_elem->layout_surface = NULL; ++ break; ++ } ++ } ++} ++ ++static int32_t deinit(struct ivi_id_agent *ida); ++ ++static void ++id_agent_module_deinit(struct wl_listener *listener, void *data) { ++ (void)data; ++ struct ivi_id_agent *ida = wl_container_of(listener, ida, destroy_listener); ++ ++ deinit(ida); ++} ++ ++static int32_t ++check_config(struct db_elem *curr_db_elem, struct ivi_id_agent *ida) ++{ ++ struct db_elem *db_elem; ++ ++ if (ida->default_surface_id <= curr_db_elem->surface_id ++ && curr_db_elem->surface_id <= ida->default_surface_id_max) { ++ weston_log("ivi-id-agent: surface_id: %d in default id interval " ++ "[%d, %d] (CONFIG ERROR)\n", curr_db_elem->surface_id, ++ ida->default_surface_id, ida->default_surface_id_max); ++ goto ivi_failed; ++ } ++ ++ wl_list_for_each(db_elem, &ida->app_list, link) ++ { ++ if(curr_db_elem == db_elem) ++ continue; ++ ++ if (db_elem->surface_id == curr_db_elem->surface_id) { ++ weston_log("ivi-id-agent: Duplicate surface_id: %d (CONFIG ERROR)\n", ++ curr_db_elem->surface_id); ++ goto ivi_failed; ++ } ++ } ++ ++ return IVI_SUCCEEDED; ++ ++ivi_failed: ++ return IVI_FAILED; ++} ++ ++static int32_t ++read_config(struct ivi_id_agent *ida) ++{ ++ struct weston_config *config = NULL; ++ struct weston_config_section *section = NULL; ++ const char *name = NULL; ++ ++ config = wet_get_config(ida->compositor); ++ if (!config) ++ goto ivi_failed; ++ ++ section = weston_config_get_section(config, "desktop-app-default", NULL, ++ NULL); ++ ++ if (section) { ++ weston_log("ivi-id-agent: Default behavior for unknown applications is " ++ "set\n"); ++ ida->default_behavior_set = 1; ++ ++ weston_config_section_get_uint(section, "default-surface-id", ++ &ida->default_surface_id, INVALID_ID); ++ weston_config_section_get_uint(section, "default-surface-id-max", ++ &ida->default_surface_id_max, INVALID_ID); ++ ++ if (ida->default_surface_id == INVALID_ID || ++ ida->default_surface_id_max == INVALID_ID) { ++ weston_log("ivi-id-agent: Missing configuration for default " ++ "behavior\n"); ++ ida->default_behavior_set = 0; ++ } ++ } else { ++ ida->default_behavior_set = 0; ++ } ++ ++ section = NULL; ++ while (weston_config_next_section(config, §ion, &name)) { ++ struct db_elem *db_elem = NULL; ++ ++ if (strcmp(name, "desktop-app") != 0) ++ continue; ++ ++ db_elem = calloc(1, sizeof *db_elem); ++ if (db_elem == NULL) { ++ weston_log("ivi-id-agent: No memory to allocate\n"); ++ goto ivi_failed; ++ } ++ ++ wl_list_insert(&ida->app_list, &db_elem->link); ++ ++ weston_config_section_get_uint(section, "surface-id", ++ &db_elem->surface_id, INVALID_ID); ++ ++ if (db_elem->surface_id == INVALID_ID) { ++ weston_log("ivi-id-agent: surface-id is not set in configuration\n"); ++ goto ivi_failed; ++ } ++ ++ weston_config_section_get_string(section, "app-id", ++ &db_elem->cfg_app_id, NULL); ++ weston_config_section_get_string(section, "app-title", ++ &db_elem->cfg_title, NULL); ++ ++ if (db_elem->cfg_app_id == NULL && db_elem->cfg_title == NULL) { ++ weston_log("ivi-id-agent: Every parameter is NULL in app " ++ "configuration\n"); ++ goto ivi_failed; ++ } ++ ++ if (check_config(db_elem, ida) == IVI_FAILED) { ++ weston_log("ivi-id-agent: No valid config found, deinit...\n"); ++ goto ivi_failed; ++ } ++ } ++ ++ if(ida->default_behavior_set == 0 && wl_list_empty(&ida->app_list)) { ++ weston_log("ivi-id-agent: No valid config found, deinit...\n"); ++ goto ivi_failed; ++ } ++ ++ return IVI_SUCCEEDED; ++ ++ivi_failed: ++ return IVI_FAILED; ++} ++ ++WL_EXPORT int32_t ++id_agent_module_init(struct weston_compositor *compositor, ++ const struct ivi_layout_interface *interface) ++{ ++ struct ivi_id_agent *ida = NULL; ++ ++ ida = calloc(1, sizeof *ida); ++ if (ida == NULL) { ++ weston_log("failed to allocate ivi_id_agent\n"); ++ goto ivi_failed; ++ } ++ ++ ida->compositor = compositor; ++ ida->interface = interface; ++ ida->desktop_surface_configured.notify = desktop_surface_event_configure; ++ ida->destroy_listener.notify = id_agent_module_deinit; ++ ida->surface_removed.notify = surface_event_remove; ++ ++ wl_signal_add(&compositor->destroy_signal, &ida->destroy_listener); ++ ida->interface->add_listener_configure_desktop_surface( ++ &ida->desktop_surface_configured); ++ interface->add_listener_remove_surface(&ida->surface_removed); ++ ++ wl_list_init(&ida->app_list); ++ if(read_config(ida) != 0) { ++ weston_log("ivi-id-agent: Read config failed\n"); ++ deinit(ida); ++ goto ivi_failed; ++ } ++ ++ return IVI_SUCCEEDED; ++ ++ivi_failed: ++ return IVI_FAILED; ++} ++ ++static int32_t ++deinit(struct ivi_id_agent *ida) ++{ ++ struct db_elem *db_elem; ++ wl_list_for_each(db_elem, &ida->app_list, link) { ++ free(db_elem->cfg_app_id); ++ free(db_elem->cfg_title); ++ free(db_elem); ++ } ++ ++ wl_list_remove(&ida->desktop_surface_configured.link); ++ wl_list_remove(&ida->destroy_listener.link); ++ wl_list_remove(&ida->surface_removed.link); ++ free(ida); ++ ++ return IVI_SUCCEEDED; ++} +diff --git a/ivi-id-agent-modules/ivi-id-agent/weston.ini.in b/ivi-id-agent-modules/ivi-id-agent/weston.ini.in +new file mode 100644 +index 0000000..48a196c +--- /dev/null ++++ b/ivi-id-agent-modules/ivi-id-agent/weston.ini.in +@@ -0,0 +1,20 @@ ++[core] ++shell=ivi-shell.so ++require-input=false ++ ++[ivi-shell] ++ivi-module=ivi-controller.so ++ivi-input-module=ivi-input-controller.so ++ivi-id-agent-module=ivi-id-agent.so ++ ++[desktop-app] ++surface-id=111 ++app-title=Flower ++ ++[desktop-app] ++surface-id=251 ++app-title=Flower ++ ++[desktop-app-default] ++default-surface-id=2000000 ++default-surface-id-max=2001000 +-- +2.7.4 + -- cgit 1.2.3-korg