summaryrefslogtreecommitdiffstats
path: root/meta-ivi/recipes-graphics/wayland/weston-1.6.0/0007-clients-a-reference-implementation-of-UI-client-how-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-ivi/recipes-graphics/wayland/weston-1.6.0/0007-clients-a-reference-implementation-of-UI-client-how-.patch')
-rw-r--r--meta-ivi/recipes-graphics/wayland/weston-1.6.0/0007-clients-a-reference-implementation-of-UI-client-how-.patch1600
1 files changed, 0 insertions, 1600 deletions
diff --git a/meta-ivi/recipes-graphics/wayland/weston-1.6.0/0007-clients-a-reference-implementation-of-UI-client-how-.patch b/meta-ivi/recipes-graphics/wayland/weston-1.6.0/0007-clients-a-reference-implementation-of-UI-client-how-.patch
deleted file mode 100644
index 45f9550..0000000
--- a/meta-ivi/recipes-graphics/wayland/weston-1.6.0/0007-clients-a-reference-implementation-of-UI-client-how-.patch
+++ /dev/null
@@ -1,1600 +0,0 @@
-From 82eab90f7842cefa60fbeaa000acc4ae71f7ff8b Mon Sep 17 00:00:00 2001
-From: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-Date: Mon, 27 Oct 2014 11:17:51 +0900
-Subject: [PATCH 07/15] clients: a reference implementation of UI client how
- to use ivi-hmi-controller.
-
-- introduces ivi-shell-user-interface.c
-
-This is launched from hmi-controller by launch_hmi_client_process and
-invoke a
-client process.
-
-The basic flow is as followed,
-1/ process invoked
-2/ read configuration from weston.ini.
-3/ draw png file to surface according to configuration of weston.ini
-4/ all parts of UI are ready. request "UI_ready" to draw UI.
-5/ Enter event loop
-6/ If a surface receives touch/pointer event, followings are invoked
-according
- to type of event and surface
-6-1/ If a surface to launch ivi_application receive touch up, it execs
- ivi-application configured in weston.ini.
-6-2/ If a surface to switch layout mode receive touch up, it sends a
-request,
- ivi_hmi_controller_switch_mode, to hmi-controller.
-6-3/ If a surface to show workspace having launchers, it sends a
-request,
- ivi_hmi_controller_home, to hmi-controller.
-6-4/ If touch down events happens in workspace,
- ivi_hmi_controller_workspace_control is sent to slide workspace.
- When control finished, event:
-ivi_hmi_controller_workspace_end_control
- is received.
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: remove pthread.h from ivi-shell-user-interface.c
-
-it doesn't refer it anymore.
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-
-clients: Change SIGTERM form SIGKILL
-
-> I cannot say, that 'volatile' in this case is wrong. It might even be necessary,
-> since you are changing it from a signal handler, which I probably overlooked.
-> Another mixup I might had is that this volatile is accessed "directly"
-> rather than through a pointer. There was something about variables accessed
-> through a pointer behaving slightly differently...
-> Anyway, since it's modified from a signal handler, keep the 'volatile'.
-> I likely have my own misconceptions about 'volatile'.
-> Btw. you cannot catch SIGKILL. Do you need to catch any signals? This code
-> makes the program exit with EXIT_SUCCESS even if killed by SIGINT.
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-user_interface reference. Update Makefile.am
-add xml to BUILT_SOURCES
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface, remove pthread from comment
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface, remove declarations in the middle
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface, remove casts to (void)
-
-> I don't think we need these casts. The warning about unused arguments is disabled, isn't it?
-> You should be able to remove casts to (void) from all places.
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface, Check return value of wl_display_dispatch.
-
-> So here is the main loop, and it gracefully ignores all error
-> conditions, which means that this program never exits if it gets
-> disconnected - instead it starts eating 100% CPU until forcefully
-> killed.
-> Now I see why you had the server kill this client. You'd better fix this
-> main loop instead.
-> For guidance, see what simple-shm.c does.
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface, Move declaration to top
-
-> Mixed decl & code.
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface, Delete signal handlings
-
-> I don't think you need to catch these at all. The default action is to
-> kill the process, which is quite fine. The default action even sets the
-> process exit code properly, unlike these.
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface.c , Remove redundant function calls
-
-> _set_user_data() is redundant here, _add_listener() does it too.
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface.c, Remove unnecessary do-while
-
-> Using if () { } else if () { ...
-> would let you get rid of one level of indent and the breaks. }
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface.c , Fix Invalid value for registry_listener
-
-> NULL here will cause a segfault when the event arrives.
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface.c ,use os_create_anonymous_file when temporary file
-
-> You should use oscreateanonymous_file() instead.
-> Here you forget to e.g. unlink the file, and set the file descriptor CLOEXEC.
-> Oh hey, my /tmp has 109 files from September from this function, and
-> it's not even a tmpfs so they actually ended up on disk. Apparently that
-> is the last time I actually tried to run this.
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface, Remove unnecessary function calls
-
-> This is a strange place for a roundtrip.
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface.c,Remove unnecessary function calls
-
-> Yet another roundtrip that makes no sense. A flush might be good, except
-> it is the main loop's job to flush.
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface.c,Remove unnecessary function calls
-
-> It does not matter if we bind only wl_shm or any number of other global
-> interfaces too, they all will be covered by the same two roundtrips.
-> The mistake the demos used to do is to call dispatch instead of one of
-> the roundtrips, IIRC.
-> For a truly correct solution, you do what weston-info.c does wrt.
-> roundtrips, but the two is enough here.
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface,Change appropriate function name
-
-> You call it createWLContext, but what it actually does is create one
-> wlsurface and one wlbuffer.
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface,Delete wl_display_roundtrip in function of WLSurface creation
-
-> Why a roundtrip here, isn't the flush enough? Well, this is a strange
-> place for a flush, too.
-> Looks like you just leak everything that gets created through this
-> function. No, wait, maybe you don't? I don't know, all the naming here
-> makes me dizzy. I'd expect a "context" here is basically a singleton,
-> since we have no need multiple contexts, but maybe here it actually
-> means a window?
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface.c ,Add wl_display_roundtrip in function of WLbuffer creation
-
-> Hmm, wonder where the other roundtrip is. Hopefully it happens before
-> you create any wlbuffers, so that the wlshm.format events are
-> guaranteed to been received.
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface.c, replace 4 spaces to tab.
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface.c, align member of structure
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients: ivi-shell-user-interface.c, align indent of parameters in methods
-
-Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-
---------------------------------------------------------------
-clients/ivi-shell-user-interface.c: whitespace fixes
-
---------------------------------------------------------------
-clients/ivi-shell-user-interface.c: split long lines
-
-hmi_homescreen_setting_create() lost one level of ident through a little
-refactoring.
-
---------------------------------------------------------------
-clients/ivi-shell-user-interface.c: remove unnecessary braces
----
- Makefile.am | 23 +-
- clients/ivi-shell-user-interface.c | 1308 ++++++++++++++++++++++++++++++++++++
- 2 files changed, 1329 insertions(+), 2 deletions(-)
- create mode 100644 clients/ivi-shell-user-interface.c
-
-diff --git a/Makefile.am b/Makefile.am
-index 76780a8..48cad9b 100644
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -364,6 +364,11 @@ libexec_PROGRAMS += \
- weston-keyboard \
- weston-simple-im
-
-+if ENABLE_IVI_SHELL
-+libexec_PROGRAMS += \
-+ weston-ivi-shell-user-interface
-+endif
-+
- demo_clients = \
- weston-flower \
- weston-image \
-@@ -590,6 +595,17 @@ nodist_weston_desktop_shell_SOURCES = \
- weston_desktop_shell_LDADD = libtoytoolkit.la
- weston_desktop_shell_CFLAGS = $(AM_CFLAGS) $(CLIENT_CFLAGS)
-
-+if ENABLE_IVI_SHELL
-+weston_ivi_shell_user_interface_SOURCES = clients/ivi-shell-user-interface.c
-+nodist_weston_ivi_shell_user_interface_SOURCES = \
-+ protocol/ivi-hmi-controller-client-protocol.h \
-+ protocol/ivi-hmi-controller-protocol.c \
-+ protocol/ivi-application-client-protocol.h \
-+ protocol/ivi-application-protocol.c
-+weston_ivi_shell_user_interface_LDADD = libtoytoolkit.la
-+weston_ivi_shell_user_interface_CFLAGS = $(AM_CFLAGS) $(CLIENT_CFLAGS)
-+endif
-+
- if BUILD_FULL_GL_CLIENTS
- demo_clients += weston-gears
- weston_gears_SOURCES = clients/gears.c
-@@ -636,8 +652,11 @@ BUILT_SOURCES += \
- protocol/fullscreen-shell-protocol.c \
- protocol/fullscreen-shell-client-protocol.h \
- protocol/xdg-shell-protocol.c \
-- protocol/xdg-shell-client-protocol.h
--
-+ protocol/xdg-shell-client-protocol.h \
-+ protocol/ivi-hmi-controller-protocol.c \
-+ protocol/ivi-hmi-controller-client-protocol.h \
-+ protocol/ivi-application-protocol.c \
-+ protocol/ivi-application-client-protocol.h
-
- westondatadir = $(datadir)/weston
- dist_westondata_DATA = \
-diff --git a/clients/ivi-shell-user-interface.c b/clients/ivi-shell-user-interface.c
-new file mode 100644
-index 0000000..3c69541
---- /dev/null
-+++ b/clients/ivi-shell-user-interface.c
-@@ -0,0 +1,1308 @@
-+/*
-+ * Copyright (C) 2013 DENSO CORPORATION
-+ *
-+ * 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 <sys/wait.h>
-+#include <unistd.h>
-+#include <stdlib.h>
-+#include <stdio.h>
-+#include <string.h>
-+#include <linux/input.h>
-+#include <assert.h>
-+#include <fcntl.h>
-+#include <signal.h>
-+#include <sys/mman.h>
-+#include <getopt.h>
-+#include <wayland-cursor.h>
-+#include "../shared/cairo-util.h"
-+#include "../shared/config-parser.h"
-+#include "../shared/os-compatibility.h"
-+#include "ivi-application-client-protocol.h"
-+#include "ivi-hmi-controller-client-protocol.h"
-+
-+/**
-+ * A reference implementation how to use ivi-hmi-controller interface to
-+ * interact with hmi-controller. This is launched from hmi-controller by using
-+ * hmi_client_start and create a pthread.
-+ *
-+ * The basic flow is as followed,
-+ * 1/ read configuration from weston.ini.
-+ * 2/ draw png file to surface according to configuration of weston.ini
-+ * 3/ set up UI by using ivi-hmi-controller protocol
-+ * 4/ Enter event loop
-+ * 5/ If a surface receives touch/pointer event, followings are invoked
-+ * according to type of event and surface
-+ * 5-1/ If a surface to launch ivi_application receive touch up, it execs
-+ * ivi-application configured in weston.ini.
-+ * 5-2/ If a surface to switch layout mode receive touch up, it sends a request,
-+ * ivi_hmi_controller_switch_mode, to hmi-controller.
-+ * 5-3/ If a surface to show workspace having launchers, it sends a request,
-+ * ivi_hmi_controller_home, to hmi-controller.
-+ * 5-4/ If touch down events happens in workspace,
-+ * ivi_hmi_controller_workspace_control is sent to slide workspace.
-+ * When control finished, event: ivi_hmi_controller_workspace_end_control
-+ * is received.
-+ */
-+
-+/*****************************************************************************
-+ * structure, globals
-+ ****************************************************************************/
-+enum cursor_type {
-+ CURSOR_BOTTOM_LEFT,
-+ CURSOR_BOTTOM_RIGHT,
-+ CURSOR_BOTTOM,
-+ CURSOR_DRAGGING,
-+ CURSOR_LEFT_PTR,
-+ CURSOR_LEFT,
-+ CURSOR_RIGHT,
-+ CURSOR_TOP_LEFT,
-+ CURSOR_TOP_RIGHT,
-+ CURSOR_TOP,
-+ CURSOR_IBEAM,
-+ CURSOR_HAND1,
-+ CURSOR_WATCH,
-+
-+ CURSOR_BLANK
-+};
-+struct wlContextCommon {
-+ struct wl_display *wlDisplay;
-+ struct wl_registry *wlRegistry;
-+ struct wl_compositor *wlCompositor;
-+ struct wl_shm *wlShm;
-+ struct wl_seat *wlSeat;
-+ struct wl_pointer *wlPointer;
-+ struct wl_touch *wlTouch;
-+ struct ivi_application *iviApplication;
-+ struct ivi_hmi_controller *hmiCtrl;
-+ struct hmi_homescreen_setting *hmi_setting;
-+ struct wl_list *list_wlContextStruct;
-+ struct wl_surface *enterSurface;
-+ int32_t is_home_on;
-+ struct wl_cursor_theme *cursor_theme;
-+ struct wl_cursor **cursors;
-+ struct wl_surface *pointer_surface;
-+ enum cursor_type current_cursor;
-+ uint32_t enter_serial;
-+};
-+
-+struct wlContextStruct {
-+ struct wlContextCommon cmm;
-+ struct wl_surface *wlSurface;
-+ struct wl_buffer *wlBuffer;
-+ uint32_t formats;
-+ cairo_surface_t *ctx_image;
-+ void *data;
-+ uint32_t id_surface;
-+ struct wl_list link;
-+};
-+
-+struct
-+hmi_homescreen_srf {
-+ uint32_t id;
-+ char *filePath;
-+ uint32_t color;
-+};
-+
-+struct
-+hmi_homescreen_workspace {
-+ struct wl_array launcher_id_array;
-+ struct wl_list link;
-+};
-+
-+struct
-+hmi_homescreen_launcher {
-+ uint32_t icon_surface_id;
-+ uint32_t workspace_id;
-+ char *icon;
-+ char *path;
-+ struct wl_list link;
-+};
-+
-+struct
-+hmi_homescreen_setting {
-+ struct hmi_homescreen_srf background;
-+ struct hmi_homescreen_srf panel;
-+ struct hmi_homescreen_srf tiling;
-+ struct hmi_homescreen_srf sidebyside;
-+ struct hmi_homescreen_srf fullscreen;
-+ struct hmi_homescreen_srf random;
-+ struct hmi_homescreen_srf home;
-+ struct hmi_homescreen_srf workspace_background;
-+
-+ struct wl_list workspace_list;
-+ struct wl_list launcher_list;
-+
-+ char *cursor_theme;
-+ int32_t cursor_size;
-+ uint32_t transition_duration;
-+};
-+
-+static void *
-+fail_on_null(void *p, size_t size, char *file, int32_t line)
-+{
-+ if (size && !p) {
-+ fprintf(stderr, "%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__)
-+#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
-+
-+/*****************************************************************************
-+ * Event Handler
-+ ****************************************************************************/
-+
-+static void
-+shm_format(void *data, struct wl_shm *pWlShm, uint32_t format)
-+{
-+ struct wlContextStruct *pDsp = data;
-+ pDsp->formats |= (1 << format);
-+}
-+
-+static struct wl_shm_listener shm_listenter = {
-+ shm_format
-+};
-+
-+static int32_t
-+getIdOfWlSurface(struct wlContextCommon *pCtx, struct wl_surface *wlSurface)
-+{
-+ struct wlContextStruct *pWlCtxSt = NULL;
-+
-+ if (NULL == pCtx || NULL == wlSurface )
-+ return 0;
-+
-+ wl_list_for_each(pWlCtxSt, pCtx->list_wlContextStruct, link) {
-+ if (pWlCtxSt->wlSurface == wlSurface)
-+ return pWlCtxSt->id_surface;
-+ }
-+
-+ return -1;
-+}
-+
-+static void
-+set_pointer_image(struct wlContextCommon *pCtx, uint32_t index)
-+{
-+ struct wl_cursor *cursor = NULL;
-+ struct wl_cursor_image *image = NULL;
-+ struct wl_buffer *buffer = NULL;
-+
-+ if (!pCtx->wlPointer || !pCtx->cursors)
-+ return;
-+
-+ if (CURSOR_BLANK == pCtx->current_cursor) {
-+ wl_pointer_set_cursor(pCtx->wlPointer, pCtx->enter_serial,
-+ NULL, 0, 0);
-+ return;
-+ }
-+
-+ cursor = pCtx->cursors[pCtx->current_cursor];
-+ if (!cursor)
-+ return;
-+
-+ if (cursor->image_count <= index) {
-+ fprintf(stderr, "cursor index out of range\n");
-+ return;
-+ }
-+
-+ image = cursor->images[index];
-+ buffer = wl_cursor_image_get_buffer(image);
-+
-+ if (!buffer)
-+ return;
-+
-+ wl_pointer_set_cursor(pCtx->wlPointer, pCtx->enter_serial,
-+ pCtx->pointer_surface,
-+ image->hotspot_x, image->hotspot_y);
-+
-+ wl_surface_attach(pCtx->pointer_surface, buffer, 0, 0);
-+
-+ wl_surface_damage(pCtx->pointer_surface, 0, 0,
-+ image->width, image->height);
-+
-+ wl_surface_commit(pCtx->pointer_surface);
-+}
-+
-+static void
-+PointerHandleEnter(void *data, struct wl_pointer *wlPointer, uint32_t serial,
-+ struct wl_surface *wlSurface, wl_fixed_t sx, wl_fixed_t sy)
-+{
-+ struct wlContextCommon *pCtx = data;
-+
-+ pCtx->enter_serial = serial;
-+ pCtx->enterSurface = wlSurface;
-+ set_pointer_image(pCtx, 0);
-+#ifdef _DEBUG
-+ printf("ENTER PointerHandleEnter: x(%d), y(%d)\n", sx, sy);
-+#endif
-+}
-+
-+static void
-+PointerHandleLeave(void *data, struct wl_pointer *wlPointer, uint32_t serial,
-+ struct wl_surface *wlSurface)
-+{
-+ struct wlContextCommon *pCtx = data;
-+
-+ pCtx->enterSurface = NULL;
-+
-+#ifdef _DEBUG
-+ printf("ENTER PointerHandleLeave: serial(%d)\n", serial);
-+#endif
-+}
-+
-+static void
-+PointerHandleMotion(void *data, struct wl_pointer *wlPointer, uint32_t time,
-+ wl_fixed_t sx, wl_fixed_t sy)
-+{
-+#ifdef _DEBUG
-+ printf("ENTER PointerHandleMotion: x(%d), y(%d)\n",
-+ gPointerX, gPointerY);
-+#endif
-+}
-+
-+/**
-+ * if a surface assigned as launcher receives touch-off event, invoking
-+ * ivi-application which configured in weston.ini with path to binary.
-+ */
-+extern char **environ; /*defied by libc */
-+
-+static pid_t
-+execute_process(char *path, char *argv[])
-+{
-+ pid_t pid = fork();
-+ if (pid < 0)
-+ fprintf(stderr, "Failed to fork\n");
-+
-+ if (pid)
-+ return pid;
-+
-+ if (-1 == execve(path, argv, environ)) {
-+ fprintf(stderr, "Failed to execve %s\n", path);
-+ exit(1);
-+ }
-+
-+ return pid;
-+}
-+
-+static int32_t
-+launcher_button(uint32_t surfaceId, struct wl_list *launcher_list)
-+{
-+ struct hmi_homescreen_launcher *launcher = NULL;
-+
-+ wl_list_for_each(launcher, launcher_list, link) {
-+ char *argv[] = { NULL };
-+
-+ if (surfaceId != launcher->icon_surface_id)
-+ continue;
-+
-+ execute_process(launcher->path, argv);
-+
-+ return 1;
-+ }
-+
-+ return 0;
-+}
-+
-+/**
-+ * is-method to identify a surface set as launcher in workspace or workspace
-+ * itself. This is-method is used to decide whether request;
-+ * ivi_hmi_controller_workspace_control is sent or not.
-+ */
-+static int32_t
-+isWorkspaceSurface(uint32_t id, struct hmi_homescreen_setting *hmi_setting)
-+{
-+ struct hmi_homescreen_launcher *launcher = NULL;
-+
-+ if (id == hmi_setting->workspace_background.id)
-+ return 1;
-+
-+ wl_list_for_each(launcher, &hmi_setting->launcher_list, link) {
-+ if (id == launcher->icon_surface_id)
-+ return 1;
-+ }
-+
-+ return 0;
-+}
-+
-+/**
-+ * Decide which request is sent to hmi-controller
-+ */
-+static void
-+touch_up(struct ivi_hmi_controller *hmi_ctrl, uint32_t id_surface,
-+ int32_t *is_home_on, struct hmi_homescreen_setting *hmi_setting)
-+{
-+ if (launcher_button(id_surface, &hmi_setting->launcher_list)) {
-+ *is_home_on = 0;
-+ ivi_hmi_controller_home(hmi_ctrl, IVI_HMI_CONTROLLER_HOME_OFF);
-+ } else if (id_surface == hmi_setting->tiling.id) {
-+ ivi_hmi_controller_switch_mode(hmi_ctrl,
-+ IVI_HMI_CONTROLLER_LAYOUT_MODE_TILING);
-+ } else if (id_surface == hmi_setting->sidebyside.id) {
-+ ivi_hmi_controller_switch_mode(hmi_ctrl,
-+ IVI_HMI_CONTROLLER_LAYOUT_MODE_SIDE_BY_SIDE);
-+ } else if (id_surface == hmi_setting->fullscreen.id) {
-+ ivi_hmi_controller_switch_mode(hmi_ctrl,
-+ IVI_HMI_CONTROLLER_LAYOUT_MODE_FULL_SCREEN);
-+ } else if (id_surface == hmi_setting->random.id) {
-+ ivi_hmi_controller_switch_mode(hmi_ctrl,
-+ IVI_HMI_CONTROLLER_LAYOUT_MODE_RANDOM);
-+ } else if (id_surface == hmi_setting->home.id) {
-+ *is_home_on = !(*is_home_on);
-+ if (*is_home_on) {
-+ ivi_hmi_controller_home(hmi_ctrl,
-+ IVI_HMI_CONTROLLER_HOME_ON);
-+ } else {
-+ ivi_hmi_controller_home(hmi_ctrl,
-+ IVI_HMI_CONTROLLER_HOME_OFF);
-+ }
-+ }
-+}
-+
-+/**
-+ * Even handler of Pointer event. IVI system is usually manipulated by touch
-+ * screen. However, some systems also have pointer device.
-+ * Release is the same behavior as touch off
-+ * Pressed is the same behavior as touch on
-+ */
-+static void
-+PointerHandleButton(void *data, struct wl_pointer *wlPointer, uint32_t serial,
-+ uint32_t time, uint32_t button, uint32_t state)
-+{
-+ struct wlContextCommon *pCtx = data;
-+ struct ivi_hmi_controller *hmi_ctrl = pCtx->hmiCtrl;
-+ const uint32_t id_surface = getIdOfWlSurface(pCtx, pCtx->enterSurface);
-+
-+ if (BTN_RIGHT == button)
-+ return;
-+
-+ switch (state) {
-+ case WL_POINTER_BUTTON_STATE_RELEASED:
-+ touch_up(hmi_ctrl, id_surface, &pCtx->is_home_on,
-+ pCtx->hmi_setting);
-+ break;
-+
-+ case WL_POINTER_BUTTON_STATE_PRESSED:
-+
-+ if (isWorkspaceSurface(id_surface, pCtx->hmi_setting)) {
-+ ivi_hmi_controller_workspace_control(hmi_ctrl,
-+ pCtx->wlSeat,
-+ serial);
-+ }
-+
-+ break;
-+ }
-+#ifdef _DEBUG
-+ printf("ENTER PointerHandleButton: button(%d), state(%d)\n",
-+ button, state);
-+#endif
-+}
-+
-+static void
-+PointerHandleAxis(void *data, struct wl_pointer *wlPointer, uint32_t time,
-+ uint32_t axis, wl_fixed_t value)
-+{
-+#ifdef _DEBUG
-+ printf("ENTER PointerHandleAxis: axis(%d), value(%d)\n", axis, value);
-+#endif
-+}
-+
-+static struct wl_pointer_listener pointer_listener = {
-+ PointerHandleEnter,
-+ PointerHandleLeave,
-+ PointerHandleMotion,
-+ PointerHandleButton,
-+ PointerHandleAxis
-+};
-+
-+/**
-+ * Even handler of touch event
-+ */
-+static void
-+TouchHandleDown(void *data, struct wl_touch *wlTouch, uint32_t serial,
-+ uint32_t time, struct wl_surface *surface, int32_t id,
-+ wl_fixed_t x_w, wl_fixed_t y_w)
-+{
-+ struct wlContextCommon *pCtx = data;
-+ struct ivi_hmi_controller *hmi_ctrl = pCtx->hmiCtrl;
-+ uint32_t id_surface = 0;
-+
-+ if (0 == id)
-+ pCtx->enterSurface = surface;
-+
-+ id_surface = getIdOfWlSurface(pCtx, pCtx->enterSurface);
-+
-+ /**
-+ * When touch down happens on surfaces of workspace, ask
-+ * hmi-controller to start control workspace to select page of
-+ * workspace. After sending seat to hmi-controller by
-+ * ivi_hmi_controller_workspace_control,
-+ * hmi-controller-homescreen doesn't receive any event till
-+ * hmi-controller sends back it.
-+ */
-+ if (isWorkspaceSurface(id_surface, pCtx->hmi_setting)) {
-+ ivi_hmi_controller_workspace_control(hmi_ctrl, pCtx->wlSeat,
-+ serial);
-+ }
-+}
-+
-+static void
-+TouchHandleUp(void *data, struct wl_touch *wlTouch, uint32_t serial,
-+ uint32_t time, int32_t id)
-+{
-+ struct wlContextCommon *pCtx = data;
-+ struct ivi_hmi_controller *hmi_ctrl = pCtx->hmiCtrl;
-+
-+ const uint32_t id_surface = getIdOfWlSurface(pCtx, pCtx->enterSurface);
-+
-+ /**
-+ * triggering event according to touch-up happening on which surface.
-+ */
-+ if (id == 0){
-+ touch_up(hmi_ctrl, id_surface, &pCtx->is_home_on,
-+ pCtx->hmi_setting);
-+ }
-+}
-+
-+static void
-+TouchHandleMotion(void *data, struct wl_touch *wlTouch, uint32_t time,
-+ int32_t id, wl_fixed_t x_w, wl_fixed_t y_w)
-+{
-+}
-+
-+static void
-+TouchHandleFrame(void *data, struct wl_touch *wlTouch)
-+{
-+}
-+
-+static void
-+TouchHandleCancel(void *data, struct wl_touch *wlTouch)
-+{
-+}
-+
-+static struct wl_touch_listener touch_listener = {
-+ TouchHandleDown,
-+ TouchHandleUp,
-+ TouchHandleMotion,
-+ TouchHandleFrame,
-+ TouchHandleCancel,
-+};
-+
-+/**
-+ * Handler of capabilities
-+ */
-+static void
-+seat_handle_capabilities(void *data, struct wl_seat *seat, uint32_t caps)
-+{
-+ struct wlContextCommon *p_wlCtx = (struct wlContextCommon*)data;
-+ struct wl_seat *wlSeat = p_wlCtx->wlSeat;
-+ struct wl_pointer *wlPointer = p_wlCtx->wlPointer;
-+ struct wl_touch *wlTouch = p_wlCtx->wlTouch;
-+
-+ if (p_wlCtx->hmi_setting->cursor_theme) {
-+ if ((caps & WL_SEAT_CAPABILITY_POINTER) && !wlPointer){
-+ wlPointer = wl_seat_get_pointer(wlSeat);
-+ wl_pointer_add_listener(wlPointer,
-+ &pointer_listener, data);
-+ } else
-+ if (!(caps & WL_SEAT_CAPABILITY_POINTER) && wlPointer){
-+ wl_pointer_destroy(wlPointer);
-+ wlPointer = NULL;
-+ }
-+ p_wlCtx->wlPointer = wlPointer;
-+ }
-+
-+ if ((caps & WL_SEAT_CAPABILITY_TOUCH) && !wlTouch){
-+ wlTouch = wl_seat_get_touch(wlSeat);
-+ wl_touch_add_listener(wlTouch, &touch_listener, data);
-+ } else
-+ if (!(caps & WL_SEAT_CAPABILITY_TOUCH) && wlTouch){
-+ wl_touch_destroy(wlTouch);
-+ wlTouch = NULL;
-+ }
-+ p_wlCtx->wlTouch = wlTouch;
-+}
-+
-+static struct wl_seat_listener seat_Listener = {
-+ seat_handle_capabilities,
-+};
-+
-+/**
-+ * Registration of event
-+ * This event is received when hmi-controller server finished controlling
-+ * workspace.
-+ */
-+static void
-+ivi_hmi_controller_workspace_end_control(void *data,
-+ struct ivi_hmi_controller *hmi_ctrl,
-+ int32_t is_controlled)
-+{
-+ struct wlContextCommon *pCtx = data;
-+ const uint32_t id_surface = getIdOfWlSurface(pCtx, pCtx->enterSurface);
-+
-+ if (is_controlled)
-+ return;
-+
-+ /**
-+ * During being controlled by hmi-controller, any input event is not
-+ * notified. So when control ends with touch up, it invokes launcher
-+ * if up event happens on a launcher surface.
-+ *
-+ */
-+ if (launcher_button(id_surface, &pCtx->hmi_setting->launcher_list)) {
-+ pCtx->is_home_on = 0;
-+ ivi_hmi_controller_home(hmi_ctrl, IVI_HMI_CONTROLLER_HOME_OFF);
-+ }
-+}
-+
-+static const struct ivi_hmi_controller_listener hmi_controller_listener = {
-+ ivi_hmi_controller_workspace_end_control
-+};
-+
-+/**
-+ * Registration of interfaces
-+ */
-+static void
-+registry_handle_global(void *data, struct wl_registry *registry, uint32_t name,
-+ const char *interface, uint32_t version)
-+{
-+ struct wlContextCommon *p_wlCtx = (struct wlContextCommon*)data;
-+
-+ if (!strcmp(interface, "wl_compositor")) {
-+ p_wlCtx->wlCompositor =
-+ wl_registry_bind(registry, name,
-+ &wl_compositor_interface, 1);
-+ } else if (!strcmp(interface, "wl_shm")) {
-+ p_wlCtx->wlShm =
-+ wl_registry_bind(registry, name, &wl_shm_interface, 1);
-+ wl_shm_add_listener(p_wlCtx->wlShm, &shm_listenter, p_wlCtx);
-+ } else if (!strcmp(interface, "wl_seat")) {
-+ p_wlCtx->wlSeat =
-+ wl_registry_bind(registry, name, &wl_seat_interface, 1);
-+ wl_seat_add_listener(p_wlCtx->wlSeat, &seat_Listener, data);
-+ } else if (!strcmp(interface, "ivi_application")) {
-+ p_wlCtx->iviApplication =
-+ wl_registry_bind(registry, name,
-+ &ivi_application_interface, 1);
-+ } else if (!strcmp(interface, "ivi_hmi_controller")) {
-+ p_wlCtx->hmiCtrl =
-+ wl_registry_bind(registry, name,
-+ &ivi_hmi_controller_interface, 1);
-+
-+ if (p_wlCtx->hmiCtrl) {
-+ ivi_hmi_controller_add_listener(p_wlCtx->hmiCtrl,
-+ &hmi_controller_listener, p_wlCtx);
-+ }
-+ }
-+}
-+
-+static void
-+registry_handle_global_remove(void *data, struct wl_registry *registry,
-+ uint32_t name)
-+{
-+}
-+
-+static const struct wl_registry_listener registry_listener = {
-+ registry_handle_global,
-+ registry_handle_global_remove
-+};
-+
-+static void
-+frame_listener_func(void *data, struct wl_callback *callback, uint32_t time)
-+{
-+ if (callback)
-+ wl_callback_destroy(callback);
-+}
-+
-+static const struct wl_callback_listener frame_listener = {
-+ frame_listener_func
-+};
-+
-+/*
-+ * The following correspondences between file names and cursors was copied
-+ * from: https://bugs.kde.org/attachment.cgi?id=67313
-+ */
-+static const char *bottom_left_corners[] = {
-+ "bottom_left_corner",
-+ "sw-resize",
-+ "size_bdiag"
-+};
-+
-+static const char *bottom_right_corners[] = {
-+ "bottom_right_corner",
-+ "se-resize",
-+ "size_fdiag"
-+};
-+
-+static const char *bottom_sides[] = {
-+ "bottom_side",
-+ "s-resize",
-+ "size_ver"
-+};
-+
-+static const char *grabbings[] = {
-+ "grabbing",
-+ "closedhand",
-+ "208530c400c041818281048008011002"
-+};
-+
-+static const char *left_ptrs[] = {
-+ "left_ptr",
-+ "default",
-+ "top_left_arrow",
-+ "left-arrow"
-+};
-+
-+static const char *left_sides[] = {
-+ "left_side",
-+ "w-resize",
-+ "size_hor"
-+};
-+
-+static const char *right_sides[] = {
-+ "right_side",
-+ "e-resize",
-+ "size_hor"
-+};
-+
-+static const char *top_left_corners[] = {
-+ "top_left_corner",
-+ "nw-resize",
-+ "size_fdiag"
-+};
-+
-+static const char *top_right_corners[] = {
-+ "top_right_corner",
-+ "ne-resize",
-+ "size_bdiag"
-+};
-+
-+static const char *top_sides[] = {
-+ "top_side",
-+ "n-resize",
-+ "size_ver"
-+};
-+
-+static const char *xterms[] = {
-+ "xterm",
-+ "ibeam",
-+ "text"
-+};
-+
-+static const char *hand1s[] = {
-+ "hand1",
-+ "pointer",
-+ "pointing_hand",
-+ "e29285e634086352946a0e7090d73106"
-+};
-+
-+static const char *watches[] = {
-+ "watch",
-+ "wait",
-+ "0426c94ea35c87780ff01dc239897213"
-+};
-+
-+struct cursor_alternatives {
-+ const char **names;
-+ size_t count;
-+};
-+
-+static const struct cursor_alternatives cursors[] = {
-+ { bottom_left_corners, ARRAY_LENGTH(bottom_left_corners) },
-+ { bottom_right_corners, ARRAY_LENGTH(bottom_right_corners) },
-+ { bottom_sides, ARRAY_LENGTH(bottom_sides) },
-+ { grabbings, ARRAY_LENGTH(grabbings) },
-+ { left_ptrs, ARRAY_LENGTH(left_ptrs) },
-+ { left_sides, ARRAY_LENGTH(left_sides) },
-+ { right_sides, ARRAY_LENGTH(right_sides) },
-+ { top_left_corners, ARRAY_LENGTH(top_left_corners) },
-+ { top_right_corners, ARRAY_LENGTH(top_right_corners) },
-+ { top_sides, ARRAY_LENGTH(top_sides) },
-+ { xterms, ARRAY_LENGTH(xterms) },
-+ { hand1s, ARRAY_LENGTH(hand1s) },
-+ { watches, ARRAY_LENGTH(watches) },
-+};
-+
-+static void
-+create_cursors(struct wlContextCommon *cmm)
-+{
-+ uint32_t i = 0;
-+ uint32_t j = 0;
-+ struct wl_cursor *cursor = NULL;
-+ char *cursor_theme = cmm->hmi_setting->cursor_theme;
-+ int32_t cursor_size = cmm->hmi_setting->cursor_size;
-+
-+ cmm->cursor_theme = wl_cursor_theme_load(cursor_theme, cursor_size,
-+ cmm->wlShm);
-+
-+ cmm->cursors =
-+ MEM_ALLOC(ARRAY_LENGTH(cursors) * sizeof(cmm->cursors[0]));
-+
-+ for (i = 0; i < ARRAY_LENGTH(cursors); i++) {
-+ cursor = NULL;
-+
-+ for (j = 0; !cursor && j < cursors[i].count; ++j) {
-+ cursor = wl_cursor_theme_get_cursor(
-+ cmm->cursor_theme, cursors[i].names[j]);
-+ }
-+
-+ if (!cursor) {
-+ fprintf(stderr, "could not load cursor '%s'\n",
-+ cursors[i].names[0]);
-+ }
-+
-+ cmm->cursors[i] = cursor;
-+ }
-+}
-+
-+static void
-+destroy_cursors(struct wlContextCommon *cmm)
-+{
-+ if (cmm->cursor_theme)
-+ wl_cursor_theme_destroy(cmm->cursor_theme);
-+
-+ free(cmm->cursors);
-+}
-+
-+/**
-+ * Internal method to prepare parts of UI
-+ */
-+static void
-+createShmBuffer(struct wlContextStruct *p_wlCtx)
-+{
-+ struct wl_shm_pool *pool;
-+
-+ int fd = -1;
-+ int size = 0;
-+ int width = 0;
-+ int height = 0;
-+ int stride = 0;
-+
-+ width = cairo_image_surface_get_width(p_wlCtx->ctx_image);
-+ height = cairo_image_surface_get_height(p_wlCtx->ctx_image);
-+ stride = cairo_image_surface_get_stride(p_wlCtx->ctx_image);
-+
-+ size = stride * height;
-+
-+ fd = os_create_anonymous_file(size);
-+ if (fd < 0) {
-+ fprintf(stderr, "creating a buffer file for %d B failed: %m\n",
-+ size);
-+ return ;
-+ }
-+
-+ p_wlCtx->data =
-+ mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
-+
-+ if (MAP_FAILED == p_wlCtx->data) {
-+ fprintf(stderr, "mmap failed: %m\n");
-+ close(fd);
-+ return;
-+ }
-+
-+ pool = wl_shm_create_pool(p_wlCtx->cmm.wlShm, fd, size);
-+ p_wlCtx->wlBuffer = wl_shm_pool_create_buffer(pool, 0,
-+ width,
-+ height,
-+ stride,
-+ WL_SHM_FORMAT_ARGB8888);
-+
-+ if (NULL == p_wlCtx->wlBuffer) {
-+ fprintf(stderr, "wl_shm_create_buffer failed: %m\n");
-+ close(fd);
-+ return;
-+ }
-+
-+ wl_display_roundtrip(p_wlCtx->cmm.wlDisplay);
-+
-+ wl_shm_pool_destroy(pool);
-+ close(fd);
-+
-+ return;
-+}
-+
-+static void
-+destroyWLContextCommon(struct wlContextCommon *p_wlCtx)
-+{
-+ destroy_cursors(p_wlCtx);
-+
-+ if (p_wlCtx->pointer_surface)
-+ wl_surface_destroy(p_wlCtx->pointer_surface);
-+
-+ if (p_wlCtx->wlCompositor)
-+ wl_compositor_destroy(p_wlCtx->wlCompositor);
-+}
-+
-+static void
-+destroyWLContextStruct(struct wlContextStruct *p_wlCtx)
-+{
-+ if (p_wlCtx->wlSurface)
-+ wl_surface_destroy(p_wlCtx->wlSurface);
-+
-+ if (p_wlCtx->ctx_image) {
-+ cairo_surface_destroy(p_wlCtx->ctx_image);
-+ p_wlCtx->ctx_image = NULL;
-+ }
-+}
-+
-+static int
-+createSurface(struct wlContextStruct *p_wlCtx)
-+{
-+ p_wlCtx->wlSurface =
-+ wl_compositor_create_surface(p_wlCtx->cmm.wlCompositor);
-+ if (NULL == p_wlCtx->wlSurface) {
-+ printf("Error: wl_compositor_create_surface failed.\n");
-+ destroyWLContextCommon(&p_wlCtx->cmm);
-+ abort();
-+ }
-+
-+ return 0;
-+}
-+
-+static void
-+drawImage(struct wlContextStruct *p_wlCtx)
-+{
-+ struct wl_callback *callback;
-+
-+ int width = 0;
-+ int height = 0;
-+ int stride = 0;
-+ void *data = NULL;
-+
-+ width = cairo_image_surface_get_width(p_wlCtx->ctx_image);
-+ height = cairo_image_surface_get_height(p_wlCtx->ctx_image);
-+ stride = cairo_image_surface_get_stride(p_wlCtx->ctx_image);
-+ data = cairo_image_surface_get_data(p_wlCtx->ctx_image);
-+
-+ memcpy(p_wlCtx->data, data, stride * height);
-+
-+ wl_surface_attach(p_wlCtx->wlSurface, p_wlCtx->wlBuffer, 0, 0);
-+ wl_surface_damage(p_wlCtx->wlSurface, 0, 0, width, height);
-+
-+ callback = wl_surface_frame(p_wlCtx->wlSurface);
-+ wl_callback_add_listener(callback, &frame_listener, NULL);
-+
-+ wl_surface_commit(p_wlCtx->wlSurface);
-+
-+ wl_display_roundtrip(p_wlCtx->cmm.wlDisplay);
-+}
-+
-+static void
-+create_ivisurface(struct wlContextStruct *p_wlCtx,
-+ uint32_t id_surface,
-+ cairo_surface_t *surface)
-+{
-+ struct ivi_surface *ivisurf = NULL;
-+
-+ p_wlCtx->ctx_image = surface;
-+
-+ p_wlCtx->id_surface = id_surface;
-+ wl_list_init(&p_wlCtx->link);
-+ wl_list_insert(p_wlCtx->cmm.list_wlContextStruct, &p_wlCtx->link);
-+
-+ createSurface(p_wlCtx);
-+ createShmBuffer(p_wlCtx);
-+
-+ ivisurf = ivi_application_surface_create(p_wlCtx->cmm.iviApplication,
-+ id_surface,
-+ p_wlCtx->wlSurface);
-+ if (ivisurf == NULL) {
-+ fprintf(stderr, "Failed to create ivi_client_surface\n");
-+ return;
-+ }
-+
-+ drawImage(p_wlCtx);
-+}
-+
-+static void
-+create_ivisurfaceFromFile(struct wlContextStruct *p_wlCtx,
-+ uint32_t id_surface,
-+ const char *imageFile)
-+{
-+ cairo_surface_t *surface = load_cairo_surface(imageFile);
-+
-+ if (NULL == surface) {
-+ fprintf(stderr, "Failed to load_cairo_surface %s\n", imageFile);
-+ return;
-+ }
-+
-+ create_ivisurface(p_wlCtx, id_surface, surface);
-+}
-+
-+static void
-+set_hex_color(cairo_t *cr, uint32_t color)
-+{
-+ cairo_set_source_rgba(cr,
-+ ((color >> 16) & 0xff) / 255.0,
-+ ((color >> 8) & 0xff) / 255.0,
-+ ((color >> 0) & 0xff) / 255.0,
-+ ((color >> 24) & 0xff) / 255.0);
-+}
-+
-+static void
-+create_ivisurfaceFromColor(struct wlContextStruct *p_wlCtx,
-+ uint32_t id_surface,
-+ uint32_t width, uint32_t height,
-+ uint32_t color)
-+{
-+ cairo_surface_t *surface = NULL;
-+ cairo_t *cr = NULL;
-+
-+ surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,
-+ width, height);
-+
-+ cr = cairo_create(surface);
-+ cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
-+ cairo_rectangle(cr, 0, 0, width, height);
-+ set_hex_color(cr, color);
-+ cairo_fill(cr);
-+ cairo_destroy(cr);
-+
-+ create_ivisurface(p_wlCtx, id_surface, surface);
-+}
-+
-+static void
-+UI_ready(struct ivi_hmi_controller *controller)
-+{
-+ ivi_hmi_controller_UI_ready(controller);
-+}
-+
-+/**
-+ * Internal method to set up UI by using ivi-hmi-controller
-+ */
-+static void
-+create_background(struct wlContextStruct *p_wlCtx, const uint32_t id_surface,
-+ const char *imageFile)
-+{
-+ create_ivisurfaceFromFile(p_wlCtx, id_surface, imageFile);
-+}
-+
-+static void
-+create_panel(struct wlContextStruct *p_wlCtx, const uint32_t id_surface,
-+ const char *imageFile)
-+{
-+ create_ivisurfaceFromFile(p_wlCtx, id_surface, imageFile);
-+}
-+
-+static void
-+create_button(struct wlContextStruct *p_wlCtx, const uint32_t id_surface,
-+ const char *imageFile, uint32_t number)
-+{
-+ create_ivisurfaceFromFile(p_wlCtx, id_surface, imageFile);
-+}
-+
-+static void
-+create_home_button(struct wlContextStruct *p_wlCtx, const uint32_t id_surface,
-+ const char *imageFile)
-+{
-+ create_ivisurfaceFromFile(p_wlCtx, id_surface, imageFile);
-+}
-+
-+static void
-+create_workspace_background(struct wlContextStruct *p_wlCtx,
-+ struct hmi_homescreen_srf *srf)
-+{
-+ create_ivisurfaceFromColor(p_wlCtx, srf->id, 1, 1, srf->color);
-+}
-+
-+static void
-+create_launchers(struct wlContextCommon *cmm, struct wl_list *launcher_list)
-+{
-+ struct hmi_homescreen_launcher **launchers;
-+ struct hmi_homescreen_launcher *launcher = NULL;
-+
-+ int launcher_count = wl_list_length(launcher_list);
-+ int ii = 0;
-+ int start = 0;
-+
-+ if (0 == launcher_count)
-+ return;
-+
-+ launchers = MEM_ALLOC(launcher_count * sizeof(*launchers));
-+
-+ wl_list_for_each(launcher, launcher_list, link) {
-+ launchers[ii] = launcher;
-+ ii++;
-+ }
-+
-+ for (ii = 0; ii < launcher_count; ii++) {
-+ int jj = 0;
-+
-+ if (ii != launcher_count - 1 &&
-+ launchers[ii]->workspace_id ==
-+ launchers[ii + 1]->workspace_id)
-+ continue;
-+
-+ for (jj = start; jj <= ii; jj++) {
-+ struct wlContextStruct *p_wlCtx;
-+
-+ p_wlCtx = MEM_ALLOC(sizeof(*p_wlCtx));
-+ p_wlCtx->cmm = *cmm;
-+ create_ivisurfaceFromFile(p_wlCtx,
-+ launchers[jj]->icon_surface_id,
-+ launchers[jj]->icon);
-+ }
-+
-+ start = ii + 1;
-+ }
-+
-+ free(launchers);
-+}
-+
-+/**
-+ * Internal method to read out weston.ini to get configuration
-+ */
-+static struct hmi_homescreen_setting *
-+hmi_homescreen_setting_create(void)
-+{
-+ struct weston_config *config = NULL;
-+ struct weston_config_section *shellSection = NULL;
-+ struct hmi_homescreen_setting *setting = MEM_ALLOC(sizeof(*setting));
-+ struct weston_config_section *section = NULL;
-+ const char *name = NULL;
-+ uint32_t workspace_layer_id;
-+ uint32_t icon_surface_id = 0;
-+
-+ wl_list_init(&setting->workspace_list);
-+ wl_list_init(&setting->launcher_list);
-+
-+ config = weston_config_parse("weston.ini");
-+
-+ shellSection =
-+ weston_config_get_section(config, "ivi-shell", NULL, NULL);
-+
-+ weston_config_section_get_string(
-+ shellSection, "cursor-theme", &setting->cursor_theme, NULL);
-+
-+ weston_config_section_get_int(
-+ shellSection, "cursor-size", &setting->cursor_size, 32);
-+
-+ weston_config_section_get_uint(
-+ shellSection, "workspace-layer-id", &workspace_layer_id, 3000);
-+
-+ weston_config_section_get_string(
-+ shellSection, "background-image", &setting->background.filePath,
-+ DATADIR "/weston/background.png");
-+
-+ weston_config_section_get_uint(
-+ shellSection, "background-id", &setting->background.id, 1001);
-+
-+ weston_config_section_get_string(
-+ shellSection, "panel-image", &setting->panel.filePath,
-+ DATADIR "/weston/panel.png");
-+
-+ weston_config_section_get_uint(
-+ shellSection, "panel-id", &setting->panel.id, 1002);
-+
-+ weston_config_section_get_string(
-+ shellSection, "tiling-image", &setting->tiling.filePath,
-+ DATADIR "/weston/tiling.png");
-+
-+ weston_config_section_get_uint(
-+ shellSection, "tiling-id", &setting->tiling.id, 1003);
-+
-+ weston_config_section_get_string(
-+ shellSection, "sidebyside-image", &setting->sidebyside.filePath,
-+ DATADIR "/weston/sidebyside.png");
-+
-+ weston_config_section_get_uint(
-+ shellSection, "sidebyside-id", &setting->sidebyside.id, 1004);
-+
-+ weston_config_section_get_string(
-+ shellSection, "fullscreen-image", &setting->fullscreen.filePath,
-+ DATADIR "/weston/fullscreen.png");
-+
-+ weston_config_section_get_uint(
-+ shellSection, "fullscreen-id", &setting->fullscreen.id, 1005);
-+
-+ weston_config_section_get_string(
-+ shellSection, "random-image", &setting->random.filePath,
-+ DATADIR "/weston/random.png");
-+
-+ weston_config_section_get_uint(
-+ shellSection, "random-id", &setting->random.id, 1006);
-+
-+ weston_config_section_get_string(
-+ shellSection, "home-image", &setting->home.filePath,
-+ DATADIR "/weston/home.png");
-+
-+ weston_config_section_get_uint(
-+ shellSection, "home-id", &setting->home.id, 1007);
-+
-+ weston_config_section_get_uint(
-+ shellSection, "workspace-background-color",
-+ &setting->workspace_background.color, 0x99000000);
-+
-+ weston_config_section_get_uint(
-+ shellSection, "workspace-background-id",
-+ &setting->workspace_background.id, 2001);
-+
-+ icon_surface_id = workspace_layer_id + 1;
-+
-+ while (weston_config_next_section(config, &section, &name)) {
-+ struct hmi_homescreen_launcher *launcher;
-+
-+ if (strcmp(name, "ivi-launcher") != 0)
-+ continue;
-+
-+ launcher = MEM_ALLOC(sizeof(*launcher));
-+ wl_list_init(&launcher->link);
-+
-+ weston_config_section_get_string(section, "icon",
-+ &launcher->icon, NULL);
-+ weston_config_section_get_string(section, "path",
-+ &launcher->path, NULL);
-+ weston_config_section_get_uint(section, "workspace-id",
-+ &launcher->workspace_id, 0);
-+ weston_config_section_get_uint(section, "icon-id",
-+ &launcher->icon_surface_id,
-+ icon_surface_id);
-+ icon_surface_id++;
-+
-+ wl_list_insert(setting->launcher_list.prev, &launcher->link);
-+ }
-+
-+ weston_config_destroy(config);
-+ return setting;
-+}
-+
-+/**
-+ * Main thread
-+ *
-+ * The basic flow are as followed,
-+ * 1/ read configuration from weston.ini by hmi_homescreen_setting_create
-+ * 2/ draw png file to surface according to configuration of weston.ini and
-+ * set up UI by using ivi-hmi-controller protocol by each create_* method
-+ */
-+int main(int argc, char **argv)
-+{
-+ struct wlContextCommon wlCtxCommon;
-+ struct wlContextStruct wlCtx_BackGround;
-+ struct wlContextStruct wlCtx_Panel;
-+ struct wlContextStruct wlCtx_Button_1;
-+ struct wlContextStruct wlCtx_Button_2;
-+ struct wlContextStruct wlCtx_Button_3;
-+ struct wlContextStruct wlCtx_Button_4;
-+ struct wlContextStruct wlCtx_HomeButton;
-+ struct wlContextStruct wlCtx_WorkSpaceBackGround;
-+ struct wl_list launcher_wlCtxList;
-+ int ret = 0;
-+ struct hmi_homescreen_setting *hmi_setting;
-+ struct wlContextStruct *pWlCtxSt = NULL;
-+
-+ hmi_setting = hmi_homescreen_setting_create();
-+
-+ memset(&wlCtxCommon, 0x00, sizeof(wlCtxCommon));
-+ memset(&wlCtx_BackGround, 0x00, sizeof(wlCtx_BackGround));
-+ memset(&wlCtx_Panel, 0x00, sizeof(wlCtx_Panel));
-+ memset(&wlCtx_Button_1, 0x00, sizeof(wlCtx_Button_1));
-+ memset(&wlCtx_Button_2, 0x00, sizeof(wlCtx_Button_2));
-+ memset(&wlCtx_Button_3, 0x00, sizeof(wlCtx_Button_3));
-+ memset(&wlCtx_Button_4, 0x00, sizeof(wlCtx_Button_4));
-+ memset(&wlCtx_HomeButton, 0x00, sizeof(wlCtx_HomeButton));
-+ memset(&wlCtx_WorkSpaceBackGround, 0x00,
-+ sizeof(wlCtx_WorkSpaceBackGround));
-+ wl_list_init(&launcher_wlCtxList);
-+ wlCtxCommon.list_wlContextStruct = MEM_ALLOC(sizeof(struct wl_list));
-+ assert(wlCtxCommon.list_wlContextStruct);
-+ wl_list_init(wlCtxCommon.list_wlContextStruct);
-+
-+ wlCtxCommon.hmi_setting = hmi_setting;
-+
-+ wlCtxCommon.wlDisplay = wl_display_connect(NULL);
-+ if (NULL == wlCtxCommon.wlDisplay) {
-+ printf("Error: wl_display_connect failed.\n");
-+ return -1;
-+ }
-+
-+ /* get wl_registry */
-+ wlCtxCommon.wlRegistry = wl_display_get_registry(wlCtxCommon.wlDisplay);
-+ wl_registry_add_listener(wlCtxCommon.wlRegistry,
-+ &registry_listener, &wlCtxCommon);
-+ wl_display_roundtrip(wlCtxCommon.wlDisplay);
-+
-+ if (wlCtxCommon.hmi_setting->cursor_theme) {
-+ create_cursors(&wlCtxCommon);
-+
-+ wlCtxCommon.pointer_surface =
-+ wl_compositor_create_surface(wlCtxCommon.wlCompositor);
-+
-+ wlCtxCommon.current_cursor = CURSOR_LEFT_PTR;
-+ }
-+
-+ wlCtx_BackGround.cmm = wlCtxCommon;
-+ wlCtx_Panel.cmm = wlCtxCommon;
-+ wlCtx_Button_1.cmm = wlCtxCommon;
-+ wlCtx_Button_2.cmm = wlCtxCommon;
-+ wlCtx_Button_3.cmm = wlCtxCommon;
-+ wlCtx_Button_4.cmm = wlCtxCommon;
-+ wlCtx_HomeButton.cmm = wlCtxCommon;
-+ wlCtx_WorkSpaceBackGround.cmm = wlCtxCommon;
-+
-+ /* create desktop widgets */
-+ create_background(&wlCtx_BackGround, hmi_setting->background.id,
-+ hmi_setting->background.filePath);
-+
-+ create_panel(&wlCtx_Panel, hmi_setting->panel.id,
-+ hmi_setting->panel.filePath);
-+
-+ create_button(&wlCtx_Button_1, hmi_setting->tiling.id,
-+ hmi_setting->tiling.filePath, 0);
-+
-+ create_button(&wlCtx_Button_2, hmi_setting->sidebyside.id,
-+ hmi_setting->sidebyside.filePath, 1);
-+
-+ create_button(&wlCtx_Button_3, hmi_setting->fullscreen.id,
-+ hmi_setting->fullscreen.filePath, 2);
-+
-+ create_button(&wlCtx_Button_4, hmi_setting->random.id,
-+ hmi_setting->random.filePath, 3);
-+
-+ create_workspace_background(&wlCtx_WorkSpaceBackGround,
-+ &hmi_setting->workspace_background);
-+
-+ create_launchers(&wlCtxCommon, &hmi_setting->launcher_list);
-+
-+ create_home_button(&wlCtx_HomeButton, hmi_setting->home.id,
-+ hmi_setting->home.filePath);
-+
-+ UI_ready(wlCtxCommon.hmiCtrl);
-+
-+ while(ret != -1)
-+ ret = wl_display_dispatch(wlCtxCommon.wlDisplay);
-+
-+ wl_list_for_each(pWlCtxSt, wlCtxCommon.list_wlContextStruct, link) {
-+ destroyWLContextStruct(pWlCtxSt);
-+ }
-+
-+ destroyWLContextCommon(&wlCtxCommon);
-+ free(wlCtxCommon.list_wlContextStruct);
-+
-+ return 0;
-+}
---
-1.7.9.5
-