diff options
Diffstat (limited to 'meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0008-ivi-shell-Add-simple-IVI-shell-layout-controller.patch')
-rw-r--r-- | meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0008-ivi-shell-Add-simple-IVI-shell-layout-controller.patch | 589 |
1 files changed, 0 insertions, 589 deletions
diff --git a/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0008-ivi-shell-Add-simple-IVI-shell-layout-controller.patch b/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0008-ivi-shell-Add-simple-IVI-shell-layout-controller.patch deleted file mode 100644 index 4e63c7a0b..000000000 --- a/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0008-ivi-shell-Add-simple-IVI-shell-layout-controller.patch +++ /dev/null @@ -1,589 +0,0 @@ -From c89c2d63db3cbe83fb1ddd983e4b0ffe87fab296 Mon Sep 17 00:00:00 2001 -From: Volodymyr Riazantsev <volodymyr.riazantsev@globallogic.com> -Date: Fri, 1 Jul 2016 00:28:50 -0400 -Subject: [PATCH 8/8] ivi-shell: Add simple IVI shell layout controller - -Simple IVI shell layout controller. -Assign only one application to primary display. -Second and rest application will go to secondary display if it's -present. - -Signed-off-by: Volodymyr Riazantsev <volodymyr.riazantsev@globallogic.com> -Signed-off-by: Karthik Ramanan <a0393906@ti.com> ---- - Makefile.am | 12 +- - ivi-shell/ivi-layout-controller-ti.c | 532 +++++++++++++++++++++++++++++++++++ - 2 files changed, 543 insertions(+), 1 deletion(-) - create mode 100644 ivi-shell/ivi-layout-controller-ti.c - -diff --git a/Makefile.am b/Makefile.am -index 55aed6d..a9fe3c8 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -868,7 +868,8 @@ if ENABLE_IVI_SHELL - - module_LTLIBRARIES += \ - $(ivi_shell) \ -- $(hmi_controller) -+ $(hmi_controller) \ -+ $(layout_controller) - - ivi_shell = ivi-shell.la - ivi_shell_la_LDFLAGS = -module -avoid-version -@@ -903,6 +904,15 @@ nodist_hmi_controller_la_SOURCES = \ - - BUILT_SOURCES += $(nodist_hmi_controller_la_SOURCES) - -+layout_controller = layout-controller.la -+layout_controller_la_LDFLAGS = -module -avoid-version -+layout_controller_la_LIBADD = $(COMPOSITOR_LIBS) libshared.la -+layout_controller_la_CFLAGS = $(AM_CFLAGS) $(COMPOSITOR_CFLAGS) -+layout_controller_la_SOURCES = \ -+ ivi-shell/ivi-layout-export.h \ -+ ivi-shell/ivi-layout-controller-ti.c \ -+ shared/helpers.h -+ - endif - - -diff --git a/ivi-shell/ivi-layout-controller-ti.c b/ivi-shell/ivi-layout-controller-ti.c -new file mode 100644 -index 0000000..b7cf436 ---- /dev/null -+++ b/ivi-shell/ivi-layout-controller-ti.c -@@ -0,0 +1,532 @@ -+/* -+ * Copyright (C) 2016 GlobalLogic Inc -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining -+ * a copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation the rights to use, copy, modify, merge, publish, -+ * distribute, sublicense, and/or sell copies of the Software, and to -+ * permit persons to whom the Software is furnished to do so, subject to -+ * the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the -+ * next paragraph) shall be included in all copies or substantial -+ * portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -+ * SOFTWARE. -+ */ -+ -+#include <stdlib.h> -+#include <string.h> -+#include <assert.h> -+ -+#include "ivi-layout-export.h" -+ -+#ifndef container_of -+#define container_of(ptr, type, member) ({ \ -+ const __typeof__( ((type *)0)->member ) *__mptr = (ptr); \ -+ (type *)( (char *)__mptr - offsetof(type,member) );}) -+#endif -+ -+#ifndef BIT -+#define BIT(bit) (1 << (bit)) -+#endif -+ -+#define __MODULE__ "layout-controller" -+#define DL_ERR BIT(0) -+#define DL_WRN BIT(1) -+#define DL_DBG BIT(2) -+#define DL_ALL (~0) -+ -+static unsigned debug_level = DL_ALL; -+ -+#define __print_log(__dl__, ... ) \ -+if (__dl__ & debug_level) \ -+ fprintf(__dl__ == DL_ERR ? stderr : stdout," ["__MODULE__"]:" __VA_ARGS__); -+ -+#define pr_err(...) __print_log(DL_ERR, "E: " __VA_ARGS__) -+#define pr_dbg(...) __print_log(DL_DBG, "D: " __VA_ARGS__) -+#define pr_wrn(...) __print_log(DL_WRN, "W: " __VA_ARGS__) -+#define TRACE() __print_log(DL_DBG, "TR: %s - %d\n", __func__, __LINE__) -+ -+ -+#define WINDOWS_TITLE_HEIGHT 30 -+#define DEFAULT_SURFACE_ID_FOR_WL_SHELL_APP 0x80000000 -+ -+/***************************************************************************** -+ * structure, globals -+ ****************************************************************************/ -+struct hmi_controller_layer { -+ struct ivi_layout_layer *ivilayer; -+ uint32_t id_layer; -+ int32_t x; -+ int32_t y; -+ int32_t width; -+ int32_t height; -+ int32_t num_surfaces; -+ pid_t pid; -+ struct wl_list link; -+ struct wl_list screen_link; -+ struct wl_list surfaces_list; -+}; -+ -+struct hmi_controller_surface { -+ void *controller; -+ void *ivisurf; -+ struct wl_list link; -+ struct wl_listener destroy_listener; -+}; -+ -+struct hmi_controller_screen { -+ struct ivi_layout_screen *iviscrn; -+ struct wl_list layers_list; -+}; -+ -+struct hmi_server_setting { -+ uint32_t base_layer_id; -+ int32_t panel_height; -+ char *ivi_homescreen; -+}; -+ -+struct hmi_controller { -+ int32_t current_layer; -+ int32_t current_screen; -+ int32_t screens_count; -+ int32_t workspace_count; -+ -+ struct hmi_server_setting *hmi_setting; -+ struct hmi_controller_screen screens[4]; -+ struct hmi_controller_layer application_layer; -+ struct weston_compositor *compositor; -+ struct wl_listener destroy_listener; -+ struct wl_client *user_interface; -+ struct wl_list layers_list; -+}; -+ -+const struct ivi_controller_interface *ivi_controller_interface; -+ -+static void -+hmi_ctrl_surface_destroy(struct wl_listener *listener, void *data); -+ -+int -+controller_module_init(struct weston_compositor *ec, -+ int *argc, char *argv[], -+ const struct ivi_controller_interface *interface, -+ size_t interface_version); -+ -+/***************************************************************************** -+ * local functions -+ ****************************************************************************/ -+static void * -+fail_on_null(void *p, size_t size, char *file, int32_t line) -+{ -+ if (size && !p) { -+ weston_log("%s(%d) %zd: out of memory\n", file, line, size); -+ exit(EXIT_FAILURE); -+ } -+ -+ return p; -+} -+ -+static void * -+mem_alloc(size_t size, char *file, int32_t line) -+{ -+ return fail_on_null(calloc(1, size), size, file, line); -+} -+ -+#define MEM_ALLOC(s) mem_alloc((s),__FILE__,__LINE__) -+ -+/** -+ * Internal method to create ivi_layer with hmi_controller_layer and -+ * add to a ivi_screen -+ */ -+static void -+create_layer(struct ivi_layout_screen *iviscrn, -+ struct hmi_controller_layer *layer) -+{ -+ int32_t ret = 0; -+ -+ layer->ivilayer = -+ ivi_controller_interface->layer_create_with_dimension(layer->id_layer, -+ layer->width, -+ layer->height); -+ assert(layer->ivilayer != NULL); -+ -+ ret = ivi_controller_interface->screen_add_layer(iviscrn, layer->ivilayer); -+ -+ assert(!ret); -+ -+ ret = ivi_controller_interface->layer_set_destination_rectangle(layer->ivilayer, -+ layer->x, layer->y, -+ layer->width, -+ layer->height); -+ assert(!ret); -+ -+ ret = ivi_controller_interface->layer_set_visibility(layer->ivilayer, true); -+ -+ assert(!ret); -+ -+ ivi_controller_interface->commit_changes(); -+ -+} -+ -+static struct hmi_controller_layer -+*get_layer_for_surface(struct hmi_controller *hmi_ctrl -+ , struct ivi_layout_surface *ivisurf -+ , bool create) -+{ -+ struct hmi_controller_layer *layer; -+ struct weston_surface *surface; -+ int32_t i = 0; -+ struct wl_client *client; -+ struct ivi_layout_screen *iviscrn = NULL; -+ struct weston_output *output = NULL; -+ pid_t pid; -+ uid_t uid; -+ gid_t gid; -+ -+ surface = ivi_controller_interface->surface_get_weston_surface(ivisurf); -+ -+ if (!surface) -+ goto exit; -+ -+ client = wl_resource_get_client(surface->resource); -+ -+ wl_client_get_credentials(client, &pid, &uid, &gid); -+ -+ wl_list_for_each(layer, &hmi_ctrl->layers_list, link) { -+ if (layer->pid == pid) { -+ pr_dbg("Existed layer for PID=%d was found\n", pid); -+ return layer; -+ } -+ } -+ -+ if (!(create && hmi_ctrl->screens_count)) -+ goto exit; -+ -+ pr_dbg("Existed layer for PID=%d was not found. Creating new\n", pid); -+ -+ for(;; i++) { -+ if (wl_list_empty(&hmi_ctrl->screens[i].layers_list) || -+ (i == (hmi_ctrl->screens_count - 1))) -+ break; -+ }; -+ -+ iviscrn = hmi_ctrl->screens[i].iviscrn; -+ -+ layer = calloc(1, sizeof *layer); -+ -+ output = ivi_controller_interface->screen_get_output(iviscrn); -+ -+ wl_list_init(&layer->link); -+ wl_list_init(&layer->screen_link); -+ wl_list_init(&layer->surfaces_list); -+ -+ layer->width = output->width; -+ layer->height = output->height + WINDOWS_TITLE_HEIGHT; -+ layer->id_layer = hmi_ctrl->hmi_setting->base_layer_id++; -+ layer->pid = pid; -+ -+ create_layer(iviscrn, layer); -+ -+ wl_list_insert(&hmi_ctrl->layers_list, &layer->link); -+ wl_list_insert(&hmi_ctrl->screens[i].layers_list, &layer->screen_link); -+ -+ return layer; -+ -+exit: -+ return NULL; -+} -+ -+static void -+set_notification_create_surface(struct ivi_layout_surface *ivisurf, -+ void *userdata) -+{ -+ struct hmi_controller *hmi_ctrl = userdata; -+ struct hmi_controller_layer *hmi_ctrl_layer = NULL; -+ struct hmi_controller_surface *hmi_ctrl_surf = NULL; -+ struct ivi_layout_layer *dest_layer; -+ struct weston_surface *surface; -+ -+ wl_list_for_each(hmi_ctrl_layer, &hmi_ctrl->layers_list, link) { -+ wl_list_for_each(hmi_ctrl_surf, &hmi_ctrl_layer->surfaces_list, link) { -+ if (hmi_ctrl_surf->ivisurf == ivisurf) { -+ pr_dbg("Surface was already configured. Skip add to list\n"); -+ return; -+ } -+ } -+ } -+ -+ pr_dbg("Surface create: add to list and get the layer\n"); -+ -+ hmi_ctrl_layer = get_layer_for_surface(hmi_ctrl, ivisurf, true); -+ dest_layer = hmi_ctrl_layer->ivilayer; -+ -+ ivi_controller_interface->layer_add_surface(dest_layer, ivisurf); -+ -+ hmi_ctrl_surf = calloc(1, sizeof(*hmi_ctrl_surf)); -+ hmi_ctrl_surf->ivisurf = ivisurf; -+ wl_list_init(&hmi_ctrl_surf->link); -+ wl_list_insert(&hmi_ctrl_layer->surfaces_list, &hmi_ctrl_surf->link); -+ -+ -+ /* -+ * Set destroy signal for surface -+ * HACK: We trying to track surfaces were created by wl_shell_emulator -+ */ -+ if (ivi_controller_interface->get_id_of_surface(ivisurf) >= -+ DEFAULT_SURFACE_ID_FOR_WL_SHELL_APP) { -+ surface = ivi_controller_interface->surface_get_weston_surface(ivisurf); -+ hmi_ctrl_surf->destroy_listener.notify = hmi_ctrl_surface_destroy; -+ wl_signal_add(&surface->destroy_signal, &hmi_ctrl_surf->destroy_listener); -+ hmi_ctrl_surf->controller = userdata; -+ } -+} -+ -+static void -+set_notification_remove_surface(struct ivi_layout_surface *ivisurf, -+ void *userdata) -+{ -+ struct hmi_controller *hmi_ctrl = userdata; -+ struct hmi_controller_layer *hmi_ctrl_layer = NULL; -+ struct hmi_controller_surface *surf = NULL; -+ struct ivi_layout_layer *dest_layer; -+ -+ wl_list_for_each(hmi_ctrl_layer, &hmi_ctrl->layers_list, link) { -+ wl_list_for_each(surf, &hmi_ctrl_layer->surfaces_list, link) { -+ if (surf->ivisurf == ivisurf) { -+ pr_dbg("Surface remove: surface was found\n"); -+ goto remove; -+ } -+ } -+ } -+ -+ goto exit; -+ -+remove: -+ dest_layer = hmi_ctrl_layer->ivilayer; -+ -+ wl_list_remove(&surf->link); -+ -+ ivi_controller_interface->layer_remove_surface(dest_layer, ivisurf); -+ -+ if (wl_list_empty(&hmi_ctrl_layer->surfaces_list)) { -+ wl_list_remove(&hmi_ctrl_layer->link); -+ wl_list_remove(&hmi_ctrl_layer->screen_link); -+ ivi_controller_interface->layer_destroy(dest_layer); -+ free(hmi_ctrl_layer); -+ } -+ -+ free(surf); -+ -+exit: -+ ivi_controller_interface->commit_changes(); -+} -+ -+static void -+hmi_ctrl_surface_destroy(struct wl_listener *listener, void *data) -+{ -+ struct hmi_controller_surface *hmi_ctrl_surface = -+ container_of(listener, struct hmi_controller_surface, -+ destroy_listener); -+ -+ pr_dbg("Try to remove surface by direct notification\n"); -+ -+ ivi_controller_interface->surface_destroy(hmi_ctrl_surface->ivisurf); -+} -+ -+static void -+set_notification_configure_surface(struct ivi_layout_surface *ivisurf, -+ void *userdata) -+{ -+ struct hmi_controller *hmi_ctrl = userdata; -+ struct hmi_controller_layer *hmi_ctrl_layer = NULL; -+ struct weston_surface *surface; -+ struct hmi_controller_surface *hmi_ctrl_surf = NULL; -+ -+ wl_list_for_each(hmi_ctrl_layer, &hmi_ctrl->layers_list, link) { -+ wl_list_for_each(hmi_ctrl_surf, &hmi_ctrl_layer->surfaces_list, link) { -+ if (hmi_ctrl_surf->ivisurf == ivisurf) { -+ pr_dbg("Surface was already configured. Skip add to list\n"); -+ goto found; -+ } -+ } -+ } -+ -+ hmi_ctrl_layer = NULL; -+found: -+ surface = ivi_controller_interface->surface_get_weston_surface(ivisurf); -+ -+ if (surface) { -+ -+ ivi_controller_interface->surface_set_source_rectangle( -+ ivisurf, 0, WINDOWS_TITLE_HEIGHT, surface->width, -+ surface->height); -+ -+#if 0 -+ ivi_controller_interface->surface_set_destination_rectangle( -+ ivisurf, 0, 0, surface->width, surface->height); -+#else -+ if (hmi_ctrl_layer) { -+ ivi_controller_interface->surface_set_destination_rectangle( -+ ivisurf, 0, 0, hmi_ctrl_layer->width, hmi_ctrl_layer->height); -+ } else { -+ ivi_controller_interface->surface_set_destination_rectangle( -+ ivisurf, 0, 0, surface->width, surface->height); -+ } -+#endif -+ ivi_controller_interface->surface_set_visibility(ivisurf, true); -+ ivi_controller_interface->commit_changes(); -+ } -+} -+ -+static struct hmi_server_setting * -+hmi_server_setting_create(struct weston_compositor *ec) -+{ -+ struct hmi_server_setting *setting = MEM_ALLOC(sizeof(*setting)); -+ struct weston_config *config = ec->config; -+ struct weston_config_section *shell_section = NULL; -+ -+ shell_section = weston_config_get_section(config, "ivi-shell", -+ NULL, NULL); -+ -+ weston_config_section_get_uint(shell_section, "base-layer-id", -+ &setting->base_layer_id, 1000); -+ -+ setting->panel_height = 30; -+ -+ return setting; -+} -+ -+static void -+hmi_controller_destroy(struct wl_listener *listener, void *data) -+{ -+ struct hmi_controller *hmi_ctrl = -+ container_of(listener, struct hmi_controller, destroy_listener); -+ -+ free(hmi_ctrl->hmi_setting); -+ free(hmi_ctrl); -+} -+ -+static struct hmi_controller * -+hmi_controller_create(struct weston_compositor *ec) -+{ -+ struct ivi_layout_screen **pp_screen = NULL; -+ struct ivi_layout_screen *iviscrn = NULL; -+ int32_t screen_length = 0; -+ struct hmi_controller *hmi_ctrl = MEM_ALLOC(sizeof(*hmi_ctrl)); -+ int i, j = 0; -+ -+ hmi_ctrl->hmi_setting = hmi_server_setting_create(ec); -+ hmi_ctrl->compositor = ec; -+ -+ ivi_controller_interface->get_screens(&screen_length, &pp_screen); -+ -+ for (i = screen_length; i-- ; j++) { -+ -+ iviscrn = pp_screen[i]; -+ hmi_ctrl->screens[j].iviscrn = iviscrn; -+ wl_list_init(&hmi_ctrl->screens[i].layers_list); -+ -+ hmi_ctrl->screens_count++; -+ } -+ -+ ivi_controller_interface->add_notification_create_surface( -+ set_notification_create_surface, hmi_ctrl); -+ ivi_controller_interface->add_notification_remove_surface( -+ set_notification_remove_surface, hmi_ctrl); -+ ivi_controller_interface->add_notification_configure_surface( -+ set_notification_configure_surface, hmi_ctrl); -+ -+ hmi_ctrl->destroy_listener.notify = hmi_controller_destroy; -+ wl_signal_add(&hmi_ctrl->compositor->destroy_signal, -+ &hmi_ctrl->destroy_listener); -+ -+ wl_list_init(&hmi_ctrl->layers_list); -+ -+ free(pp_screen); -+ pp_screen = NULL; -+ -+ return hmi_ctrl; -+} -+ -+WL_EXPORT const struct wl_interface ivi_hmi_controller_interface = { -+ "ivi_layout_controller", 1, -+ 0, NULL, -+ 0, NULL, -+}; -+ -+static void -+bind_hmi_controller(struct wl_client *client, -+ void *data, uint32_t version, uint32_t id) -+{ -+ struct hmi_controller *hmi_ctrl = data; -+ -+ if (hmi_ctrl->user_interface != client) { -+ struct wl_resource *res = wl_client_get_object(client, 1); -+ wl_resource_post_error(res, -+ WL_DISPLAY_ERROR_INVALID_OBJECT, -+ "hmi-controller failed: permission denied"); -+ return; -+ } -+ -+ wl_resource_create(client, &ivi_hmi_controller_interface, 1, id); -+} -+ -+static int32_t -+initialize(struct hmi_controller *hmi_ctrl) -+{ -+ struct config_command { -+ char *key; -+ uint32_t *dest; -+ }; -+ -+ struct weston_config *config = hmi_ctrl->compositor->config; -+ -+ weston_config_get_section(config, "ivi-shell", NULL, NULL); -+ -+ return 1; -+} -+ -+/***************************************************************************** -+ * exported functions -+ ****************************************************************************/ -+WL_EXPORT int -+controller_module_init(struct weston_compositor *ec, -+ int *argc, char *argv[], -+ const struct ivi_controller_interface *interface, -+ size_t interface_version) -+{ -+ struct hmi_controller *hmi_ctrl = NULL; -+ -+ -+ if (interface_version < sizeof(struct ivi_controller_interface)) { -+ weston_log("ivi-layout-controller-ti: version mismatch of controller interface"); -+ return -1; -+ } -+ -+ ivi_controller_interface = interface; -+ -+ hmi_ctrl = hmi_controller_create(ec); -+ -+ if (!initialize(hmi_ctrl)) { -+ return -1; -+ } -+ -+ if (wl_global_create(ec->wl_display, -+ &ivi_hmi_controller_interface, 1, -+ hmi_ctrl, bind_hmi_controller) == NULL) { -+ return -1; -+ } -+ -+ weston_log("ivi-layout-controller-ti: Successfully started."); -+ -+ return 0; -+} --- -2.4.5 - |